2013-11-09 50 views
0

我有一個相對複雜的關係,我需要在用戶對象和許多查找表之間建立關係。用戶對象是你的軋機用戶模式運行:如何在實體框架中設置複雜的多對多關係4代碼優先

public class Youth : IAuditInfo 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public Guid YouthGuid { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Address Address { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime ModifiedDate { get; set; } 
    public string ImageName { get; set; } 
    [ForeignKey("FkYouthId")] 
    public ICollection<User> Parents { get; set; } 
    public CubPack Pack { get; set; } 
    public virtual ICollection<RequirementsLog> RequirementsLogs { get; set; } 
    public Youth() 
    { 
     Parents = new List<User>(); 
    } 
} 

查找表是它得到複雜,我想不通的複雜性最小的路徑結合在一起。對於查找它是一系列開始與一個「主」表的表,該分層滾下要求和子的要求,這樣的:

站長:

public class BearTrail 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<BearTrailRequiredBadge> BearTrailRequiredBadges { get; set; } 
    public virtual ICollection<BearTrailElectiveBadge> BearTrailElectivedBadges { get; set; } 
} 

必需徽章:

public class BearTrailRequiredBadge 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Number { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<BearTrailRequiredBadgeSubRequirement> BearTrailRequiredBadgeSubRequirements { get; set; } 
} 

必需的徽章子要求:

public class BearTrailRequiredBadgeSubRequirement 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Number { get; set; } 
    public string Text { get; set; } 
    public bool Required { get; set; } 
} 

這是一組查找s,這裏大概有四個嵌套類,還有一個表也是這樣。總查找表大約爲16個,可以給予或者考慮。

我最初想,如果用我的RequirementLog模型綁定它:

public class RequirementsLog 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual ICollection<Youth> Youth { get; set; } 
    public BearTrail BearTrailRequirements { get; set; } 
    public TigerTrail TigerTrailRequirements { get; set; } 
    public WolfTrail WolfTrailRequirements { get; set; } 
    public WebelosTrail WebelosTrailRequirements { get; set; } 
    public WebelosArrowOfLight WebelosArrowOfLightRequirements { get; set; } 
} 

所以就有了許多人RequirementsLog和青年之間的許多。在RequirementsLog中創建的表有一個PK列(ID)和每個屬性的FK列。由此創建的多對多表(RequirementsLogYouths)有兩個PK(RequirementsLogId和YouthId)。

我對此有何看法?最終目標是將16桌左右的服務器列爲各種需求清單,並有另一個表格跟蹤特定年輕人在需求方面的進展情況。我很難看到這些DBA的東西,所以任何輸入將不勝感激。

回答

1
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    modelBuilder.Entity<Entity1>() 
     .HasMany(b => b.Entities2) 
     .WithMany(p => p.Entities1) 
     .Map(m => 
     { 
      m.ToTable("Entitie1Entity2"); 
      m.MapLeftKey("Entity1Id"); 
      m.MapRightKey("Entity2Id"); 
     });    
    } 
+0

這個問題,如果你可以詳細說明一下。我熟悉流利的api,並且在兩種實體類型之間給出一個m2m表格。因此,對於這個提議的解決方案,我是否會爲我擁有的4-6個「主」表或者所有16個表執行此操作?那麼,重複上面的每個綁定我需要的片段?這是怎麼讓我有一個方法來有一個列來標記項目已完成等? – ledgeJumper

+0

正如您所描述的那樣,您只需要爲RequirementsLog和Youth提供這麼多對象,就像您自己說的那樣。你所有的徽章「樹」應該有一個父母的fk。 RequirementsLog將繼續引用特定的Youth的查找。現在我不明白爲什麼你需要一個RequirementsLog的許多年輕人? – dblk1965

2

在大多數情況下,要求「日誌」在一個(人)對許多(日誌)。

除非...一個記錄的項目是許多孩子... 如果是這樣,你需要第三個表,將許多人映射到多個記錄的事件。也就是說,如果這確實是多對多的話。總的來說,這種情況幾乎總是需要第三個中間映射表。在許多設計中閱讀一下,你會很快看到它,它有多簡單。

+0

我很欣賞這個輸入。我實際上最終選擇了類似於這種方法的東西。 – ledgeJumper

相關問題