2013-11-09 31 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

相关问题