7

我想使用实体框架 6 代码优先方法来实现分层数据结构(例如产品 --> 产品 2 ----> 产品 3、产品 2----> 产品 4)。有几种方法可用,但我认为闭包表方法可以满足我的所有要求。有人可以指导我如何有效地在实体框架 6 中实现闭包表方法或任何其他替代方法吗?

4

1 回答 1

3

您需要的是与实体本身的多对多关系:例如:

public class SelfReferencingEntity
{
    public SelfReferencingEntity()
    {
        RelatedSelfReferencingEntitys = new HashSet<SelfReferencingEntity>();
        OtherRelatedSelfReferencingEntitys = new HashSet<SelfReferencingEntity>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    public int SelfReferencingEntityId { get; set; }

    public string Name { get; set; }

    public decimal Cost { get; set; }

    public virtual ICollection<SelfReferencingEntity> RelatedSelfReferencingEntitys { get; set; }

    public virtual ICollection<SelfReferencingEntity> OtherRelatedSelfReferencingEntitys { get; set; }
}

并且您需要重写 DbContext 的 OnModelCreating 方法以支持类似于以下的多对多自引用:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<SelfReferencingEntity>()
    .HasMany(p => p.RelatedSelfReferencingEntitys)
    .WithMany(p => p.OtherRelatedSelfReferencingEntitys)
    .Map(m =>
    {
        m.MapLeftKey("SelfReferencingEntityId");
        m.MapRightKey("RelatedSelfReferencingEntityId");
        m.ToTable("RelatedSelfReferencingEntity", "");
    });
}

在Entity Framework 6 Recipes一书的第 6.3 章中有一个非常好的完整示例,它解决了这个问题和传递关系(跨越多个级别的关系),它的代码可以通过我提到的链接下载。

于 2014-09-24T08:44:12.880 回答