, EF

2016-07-01 5 views
0
내가 자기 참조 아이들의 숫자가있는 카탈로그 기관 항목을 기반으로 클래스를 정의하고

을에 자체 참조 목록 속성에 열 이름을 정의 기본 SQL 데이터베이스의 Authority 테이블에서 각 List 등록 정보의 열 이름은 Authority_ID, Authority_ID1, Authority_ID2 및 Authority_ID3입니다., EF

필자는 'UsedFor', 'Equivalent', 'Broader'및 'Narrower'라는 열 이름을 사용하려고합니다. [Column ("name")] 특성을 사용해 보았지만 작동하지 않습니다. 코드 첫 번째로 어떻게해야합니까?

답변

0

시도해보십시오. 외래 키의 정의가 POCO 클래스에 있어야하는지 확실하지 않습니다 (생략 할 수 있습니다).

public class Authority 
{ 
    [Key()] 
    public long ID { get; set; } 
    public string Term { get; set; } 
    public string Language { get; set; } 
    public bool PreferredTerm { get; set; } 
    public TermStatus TermStatus { get; set; } 
    public Authority Use { get; set; } 

    [Required] 
    public long Authority_ID { get; set; } 

    [Required] 
    public long Authority_ID1 { get; set; } 

    [Required] 
    public long Authority_ID2 { get; set; } 

    [Required] 
    public long Authority_ID3 { get; set; } 

    [ForeignKey("Authority_ID")] 
    public ICollection<Authority> UsedFor { get; set; } 

    [ForeignKey("Authority_ID1")] 
    public ICollection<Authority> Equivalent { get; set; } 

    [ForeignKey("Authority_ID2")] 
    public ICollection<Authority> Broader { get; set; } 

    [ForeignKey("Authority_ID3")] 
    public ICollection<Authority> Narrower { get; set; } 
} 
0

감사 :

public class Authority 
{ 
    [InverseProperty("UsedFor")]  
    public List<Authority> UsedFor { get; set; } 
    [InverseProperty("Equivalent")] 
    public List<Authority> Equivalent { get; set; }  
} 

은 더를 참조하십시오. 나는 목록으로 열을 정의하더라도 때문에이 또한 정의에 중요한 실수를했다 그러나 어떤 일을하는 것은, 즉

[Column("Use")] 
    public long? UseID { get; set; } 

    [ForeignKey("UseID")] 
    public List<Authority> Use { get; set; } 

, 열 이름을 변경 링크와 [열]에 대한 [외래 키]를 사용하는 것이 었습니다 위의 코드는 1-to-0/1 키로 끝납니다. 내가 정말로해야 할 일은 많은 값들을 받아들이 기 위해서 자식 테이블을 추가하는 것이었다.

내 마지막 코드는 다음과 같습니다 및 기본 열 이름은 Authority_ID3 읽을 대신 Authority_ID, Authority_ID1, Authority_ID2하고 있습니다 : 나는 또한 추가 한 캐스 케이 딩을 방지하기 위해

public class Authority 
{ 
    public long ID { get; set; } 
    public string Term { get; set; } 
    public string Language { get; set; } 
    public bool PreferredTerm { get; set; } 
    public TermStatus TermStatus { get; set; } 

    //Establish 1-to-0/1 self-referencing key 
    [Column("Use")] 
    public long? UseID { get; set; } 

    [ForeignKey("UseID")] 
    public List<Authority> Use { get; set; } 

    //Establis 1-many foreign keys 
    [ForeignKey("UsedFor")] 
    public List<AuthorityList> UsedFor { get; set; } 

    [ForeignKey("Equivalent")] 
    public List<AuthorityList> Equivalent { get; set; } 

    [ForeignKey("Broader")] 
    public List<AuthorityList> Broader { get; set; } 

    [ForeignKey("Narrower")] 
    public List<AuthorityList> Narrower { get; set; } 
} 

public class AuthorityList 
{ 
    public long ID { get; set; } 
    public long AuthorityID { get; set; } 
    public long? UsedFor { get; set; } 
    public long? Equivalent { get; set; } 
    public long? Broader { get; set; } 
    public long? Narrower { get; set; } 
} 

이 방법으로 점점 삭제합니다

내 데이터베이스 컨텍스트에 다음 (전체 DB뿐만 아니라이 테이블에 영향을 미치는) :

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
0

업데이트 대답 :

위와 같이 사용하면 원하는 기본 테이블 구조를 얻을 수 있었지만 EF가 1-M이 아닌 1-1 관계를 매핑하기로 결정한 이후로 필자가 요구 한 기능이 아닙니다. 대답은 EntityFramework가 자체 참조하는 다 - 대 - 다 관계를 관리하는 방법을 이해하는 것입니다. 심지어 이것은 1-M 관계가 2 개 이상인지 여부에 따라 여러 가지 방법으로 구성 할 수 있습니다. 나는 6을 원해.

결국이 구성은 나에게 이상적인 데이터베이스 구조보다 적은 비용으로 원하는 기능을 제공했습니다.

는 는
public class Tag 
{ 
    public int ID { get; set; } 
    public string Term { get; set; } 

    public virtual ICollection<Tag> Broader { get; set; } 
    public virtual ICollection<Tag> Narrower { get; set; } 
    public virtual ICollection<Tag> Equivalent { get; set; } 
    public virtual ICollection<Tag> Related { get; set; } 
    public virtual ICollection<Tag> Use { get; set; } 
    public virtual ICollection<Tag> Usefor { get; set; } 

    public Tag() 
    { 
     Broader = new HashSet<Tag>(); 
     Narrower = new HashSet<Tag>(); 
     Equivalent = new HashSet<Tag>(); 
     Related = new HashSet<Tag>(); 
     Use = new HashSet<Tag>(); 
     Usefor = new HashSet<Tag>(); 
    } 
} 
나는 또한 데이터베이스 컨텍스트의 'OnModelCreating'프로 시저에 다음 항목을 추가하는 데 필요한

:

 //Broader/Narrower example 
     var music = new Tag{ Term = "Music"}; 
     var jazz = new Tag{ Term = "Jazz Music" }; 
     var classical = new Tag{ Term = "Classical Music" }; 

     music.Narrower.Add(jazz); 
     music.Narrower.Add(classical); 
     jazz.Broader.Add(music); 
     classical.Broader.Add(music); 

     //Equivalent example 
     var zucchini = new Tag{ Term = "Zucchini" }; 
     var courgette = new Tag{ Term = "Courgette" }; 

     zucchini.Equivalent.Add(courgette); 
     courgette.Equivalent.Add(zucchini); 

     context.Tags.Add(music); 
     context.Tags.Add(jazz); 
     context.Tags.Add(classical); 
     context.Tags.Add(zucchini); 
     context.Tags.Add(courgette); 
     context.SaveChanges(); 
:

modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Broader) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("BroaderID").ToTable("TagBroader")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Equivalent) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("EquivalentID").ToTable("TagEquivalent")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Narrower) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("NarrowerID").ToTable("TagNarrower")); 

    modelBuilder.Entity<Tag>() 
      .HasMany(x => x.Related) 
      .WithMany() 
      .Map(x => x.MapLeftKey("TagID").MapRightKey("RelatedID").ToTable("TagRelated")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Use) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("UsedID").ToTable("TagUse")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Usedfor) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("UsedforID").ToTable("TagUsedfor")); 

테스트, 나는 다음을 사용