我无法找到令人满意的提示,因为我的问题如下所述。我发现的所有结果都指的是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中,事情会更容易。
欢迎任何有关如何解决此问题的建议。
谢谢。