EF 6.1:在派生类中加载集合

时间:2014-07-28 16:17:49

标签: c# entity-framework entity-framework-6

我无法找到令人满意的提示,因为我的问题如下所述。我发现的所有结果都指的是EF 4无法解决问题。我使用的是EF 6.1和Code First方法。

这是我的班级结构:

public class Order 
{
    public List<Pack> Packs { get; set; }   
}

public class Pack
{
     public List<DocumentBase> Documents { get; set; }
}

public abstract class DocumentBase
{
}

public class Document1 : DocumentBase
{
    public List<Document1SpecificClass> D1SpecificObjects { get; set; }
}

这是上下文的相关部分:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>().HasKey(o => o.Key);
        modelBuilder.Entity<Pack>().HasKey(o => o.Key);
        modelBuilder.Entity<DocumentBase>().HasKey(o => o.Key);
        modelBuilder.Entity<Order>().HasMany(o => o.Packs).WithRequired();
        modelBuilder.Entity<Pack>().HasMany(p => p.Documents).WithRequired();

        modelBuilder.Entity<Document1SpecificClass>().HasKey(o => o.Key);
        modelBuilder.Entity<Document1>().HasMany(o => o.D1SpecificObjects);
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<Pack> Packs { get; set; }
    public DbSet<DocumentBase> Documents { get; set; }
}

我实现了一个OrderRepository类,它根据各种输入参数(订单ID,订单密钥,发票等)检索订单。我想正确地使用数据库中的相应数据加载D1SpecificObjects集合。 OrderRepository中的方法示例:

Order FindByInvoice(string invoice)
{
    using (var dbContext = new SqlDbContext(DBContextName))
    {
        return dbContext.Orders.Where(o => o.Invoice == invoice).Include("Packs.Documents").FirstOrDefault();
    }
}

以下断言失败:

var order = OrderRepository.FindByInvoice("1234asdf");
var document = order.FindDocumentById(123456); // This is a Document1 document
Assert.IsNotNull(document.D1SpecificObjects);

断言失败似乎是合理的,因为我没有指示EF在文档中加载Document1SpecificClass的集合,就像我对订单的Packs和Documents所做的那样,但是我找不到或弄清楚通知EF加载这些实体的合理方式。

我找到的解决方案是:

Order FindByInvoice(string invoice)
{
    using (var dbContext = new SqlDbContext(DBContextName))
    {
        var order = dbContext.Orders.Where(o => o.Invoice == invoice).Include("Packs.Documents").FirstOrDefault();
        if (null != order)
        {
            order.Packs.ForEach(pack =>
                {
                    dbContext.Entry(pack)
                        .Collection(p => p.Documents)
                        .Query()
                        .OfType<Document1>()
                        .Include(doc1 => doc1.D1SpecificObjects)
                        .Load();
                });
        }
        return order;
    }
}

对于订单中的每个包,我强制为Document1类型的文档加载D1SpecificObjects。我对这个解决方案不是很满意,因为它使OrderRepository的代码混乱,它应该与文档类型无关。使用DocumentBase派生的多个类以及它们自己的特定集合会变得更糟。我的印象是,在EF 6中,事情会更容易。

欢迎任何有关如何解决此问题的建议。

谢谢。

0 个答案:

没有答案
相关问题