0

我需要在用户对象和许多查找表之间建立一个相对复杂的关系。用户对象是您运行的磨机用户模型:

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; }
}

这是一组查找,大约有四个这样的嵌套类,还有一些是表外的。总查找表大约是 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 和 Youth 之间存在多对多。根据RequirementsLog 创建的表有一个PK 列(ID),每个属性都有一个FK 列。由此创建的多对多表(RequirementsLogYouths)有两个PK(RequirementsLogId 和YouthId)。

我会以正确的方式解决这个问题吗?最终目标是让 16 个左右的表服务器作为各种要求的列表,并有另一个表来跟踪特定年轻人通过要求的进度。我很难想象这些 DBA 的一些东西,所以任何输入都将不胜感激。

4

2 回答 2

2

在大多数情况下,需求“日志”是一对(人)对多(日志)。

除非...一个记录的项目是为许多孩子准备的...如果是这样,您需要第三张表,它将许多人映射到多个记录的事件。也就是说,如果这真的是多对多的话。一般来说,这种情况几乎总是需要第三个中间映射表。阅读多对多的设计,你会很快看到它,它是多么简单。

于 2013-11-10T00:51:35.230 回答
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");
        });            
    }
于 2013-11-09T14:58:23.360 回答