entity-framework - 带有 Entity Framework 6 的闭包表

标签 entity-framework hierarchical transitive-closure-table

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

最佳答案

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

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章详细描述了一个非常好的完整示例。它解决了这个问题和传递关系(跨越多个级别的关系)及其代码可通过我提到的链接下载。

关于entity-framework - 带有 Entity Framework 6 的闭包表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22929704/

相关文章:

asp.net-mvc - 无法播种用户和角色

python - 在多级列数据帧上就地前向填充

javascript - vis.js网络:与节点数有关的分层布局问题

python - 使用 Pandas 从文件中读取分层 ascii 表

PostgreSQL 将数据从递归 CTE 传递到函数

sql - 在多个父级的封闭表中移动

c# - 查找与给定抵达/出发日期冲突的预订

c# - 如何发布带有数据库的 WPF

c# - 无法将类型 A 转换为类型 B。LINQ to Entities 仅支持转换 EDM 原语或枚举类型

mySQL 传递闭包表