从部分类中在Entity Framework 6中显式加载的推荐方法是什么?

时间:2014-02-21 03:49:01

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

我正在从EF4升级到EF6并正在完成重大变化。丢失的.IsLoaded.Load方法显然不再可用,我遇到了一些问题。以前我有一些代码来确保如果数据可用,它已被加载,但不确定如何通过升级到EF6来更改它。

EF4代码:

if ((this.EntityState == EntityState.Modified) || (this.EntityState == EntityState.Unchanged)) 
{
    if (!this.AccountReference.IsLoaded)
    {
        this.AccountReference.Load();
    }
}

现在.EntityState.IsLoaded.Load都缺失了。到目前为止我所看到的http://msdn.microsoft.com/en-us/data/jj574232.aspx建议context.[stuff],但是因为这是部分课程,所以我没有使用context.[stuff]

2 个答案:

答案 0 :(得分:2)

恭喜!你转向了比以前更好的API。 DbContext API优于旧ObjectContext API的原因有很多,但在您的情况下,最初可能会感觉降级。

我的EntityState在哪里,哪里是我的Reference

关注点分离是关键。 DbContext API旨在持久性无知:业务逻辑与数据层关注点之间的分离。 ObjectContext API生成的实体太忙于跟踪自己的状态,加载自己的引用和集合并通知自己的更改。任何业务逻辑都很容易与持久性逻辑纠缠在一起。

DbContext生成器生成的实体类是POCO。所有这些与数据相关的职责都转移到了变更跟踪器。 POCO可以专注于业务逻辑。 (它们仍然与DDD域不同,但这是一个不同的讨论。)

如果您愿意,您仍然可以返回ObjectContext API,但我不会推荐它。您的代码显示API鼓励不良做法:

  • 加载自己的引用或集合的对象很容易导致N + 1反模式(1个查询加载对象,后跟每个对象的“N”个查询)。
  • 对于能够加载自己的数据的对象,上下文必须是活的,所以这会鼓励长期的上下文反模式。

DbContext API鼓励您根据需要加载对象图,然后处理上下文。但这取决于。在智能客户端应用程序中,您可以为每个表单设在Web应用程序中,强烈建议每个请求使用上下文。

正如您在对Tieson T.的评论中所说,只要您访问导航属性并且conditions for lazy loading已满足,就可以依赖延迟加载,但上述反模式仍然适用。

因此,我认为您暂时可以保留应用程序代码,但请查看DbContext API鼓励您遵守的模式。至于我,延迟加载接近于反模式。

答案 1 :(得分:1)

我将不得不寻找其他人,但State可以通过以下方式找到:

context.Entry(yourEFobject).State

其中context是您的DbContext个实例。

正如@GertArnold在他的评论中提到的,EF6中的实体对象是简单的POCO,因此你无法直接从它们中读取状态等。

此答案似乎涵盖.IsLoaded.Loadhttps://stackoverflow.com/a/13366108/534109

该答案的内容包括完整性:

context.Entry(yourEntity)
   .Collection(entity => entity.NavigationProperty)
   .IsLoaded;

context.Entry(yourEntity)
   .Collection(entity => entity.NavigationProperty)
   .Load();