单个实体上的多对多对另一个多对多

Many to many to another many to many on single entity

我有一个关于使用 entity framework 的多对多关系的简单问题。

情况是这样的我有 3 个模型 SectionName:

public class SectionName : BaseEntity
{
    public SectionName()
    {
        SectionsSuffix = new List<SectionSuffix>();
    }

    [Required]
    public string Name { get; set; }

    public ICollection<SectionSuffix> SectionsSuffix { get; set; }
}

章节后缀:

[Table("SectionsSuffix")]
public class SectionSuffix : BaseEntity
{
    public SectionSuffix()
    {
        SectionLines = new List<SectionLine>();
        SectionsName = new List<SectionName>();
    }

    [Required]
    public string Name { get; set; }

    public ICollection<SectionLine> SectionLines { get; set; }
    public ICollection<SectionName> SectionsName { get; set; }
}

和剖面线:

[Table("SectionLines")]
public class SectionLine : BaseEntity
{
    public SectionLine()
    {
        SectionsSuffix = new List<SectionSuffix>();
    }

    [Required]
    public string Name { get; set; }

    public ICollection<SectionSuffix> SectionsSuffix { get; set; }
}

现在,在使用 FluentApi 和联结表的上下文中,SectionsName 与 SectionsSuffix 多对多相关,并且与 SectionLines 多对多相关:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SectionName>()
            .HasMany(suffix => suffix.SectionsSuffix)
            .WithMany(name => name.SectionsName)
            .Map(nameSuffix =>
            {
                nameSuffix.ToTable("SectionsNameSuffix");
                nameSuffix.MapLeftKey("SectionNameId");
                nameSuffix.MapRightKey("SectionSuffixId");
            });

        modelBuilder.Entity<SectionSuffix>()
            .HasMany(line => line.SectionLines)
            .WithMany(suffix => suffix.SectionsSuffix)
            .Map(nameSuffix =>
            {
                nameSuffix.ToTable("SectionsSuffixLines");
                nameSuffix.MapLeftKey("SectionSuffixId");
                nameSuffix.MapRightKey("SectionLinesId");
            });
    }

现在,如果我调用 SectionsNames 时没有问题,我可以获得 SectionsSuffix 列表,我想通过这个调用也获得绑定到特定 SectionSuffix 的 SectionNames 列表,这可能吗?

现在使用存储库模式过程如下所示:

    IList<SectionName> sections = SectionRepository.GetAll(x => x.SectionsSuffix).ToList();

    public virtual IEnumerable<T> GetAll(params Expression<Func<T, object>>[] includes)
    {
        IQueryable query = includes.Aggregate(_dbSet.AsQueryable(), (current, include) => current.Include(include));
        return (IEnumerable<T>) query;
    }

如果我要查询某事。就像你想做的那样:

using System;
using System.Data.Entity;

public class SectionRepository
{
    private readonly _context;


    public SectionRepository(IMyDbContext context)
    {
        _context = context
    }

    public ICollection<SectionName> GetAll()
    {
        return _context.SectionNames
            .Include(sn => sn.SectionsSuffix.SectionLine)
            .Select(sn => sn).ToList();
    }
}

请试一试,上面的代码没有经过测试。

答案很简单,我需要使用:

IList<SectionName> sections = SectionRepository.GetAll(name => name.SectionsSuffix, 
name => name.SectionsSuffix.Select(suffix => suffix.SectionLines)).ToList();

public virtual IEnumerable<T> GetAll(params Expression<Func<T, object>>[] includes)
{
    IQueryable query = includes.Aggregate(_dbSet.AsQueryable(), (current, include) => current.Include(include));
    return (IEnumerable<T>) query;
}