closure tables with entity framework 6
Asked Answered
O

1

7

I want to implement hierarchical data structure (e.g Product --> Product 2 ----> Product3, Product 2----> Product4) using entity framework 6 code first approach. There are several approaches available but i think closure table approach is one that can fulfill all of my requirements. Can some one guide me how to implement closure table approach in entity framework 6 efficiently or any other alternatives?

Oat answered 8/4, 2014 at 6:54 Comment(1)
Sounds to me like you simply need a ProductHierarchy class with a List<ProductHierarchy> children property. What requirements do you feel wouldn't be fullfilled?Attaboy
B
3

what you need is a many-to-many relationship with an entity itself: For instance:

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

and you need to override OnModelCreating method of DbContext to support the many-many self referencing similar to the following:

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", "");
    });
}

There is a very nice complete example fully described in chapter 6.3 of the book Entity Framework 6 Recipes which addresses this issue and transitive relationship (relationship spanning multiple levels) and its code is available to download through the link I mentioned.

Become answered 24/9, 2014 at 8:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.