我正在从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]
。
答案 0 :(得分:2)
恭喜!你转向了比以前更好的API。 DbContext
API优于旧ObjectContext
API的原因有很多,但在您的情况下,最初可能会感觉降级。
EntityState
在哪里,哪里是我的Reference
?关注点分离是关键。 DbContext
API旨在持久性无知:业务逻辑与数据层关注点之间的分离。 ObjectContext
API生成的实体太忙于跟踪自己的状态,加载自己的引用和集合并通知自己的更改。任何业务逻辑都很容易与持久性逻辑纠缠在一起。
DbContext
生成器生成的实体类是POCO。所有这些与数据相关的职责都转移到了变更跟踪器。 POCO可以专注于业务逻辑。 (它们仍然与DDD域不同,但这是一个不同的讨论。)
如果您愿意,您仍然可以返回ObjectContext
API,但我不会推荐它。您的代码显示API鼓励不良做法:
DbContext
API鼓励您根据需要加载对象图,然后处理上下文。但这取决于。在智能客户端应用程序中,您可以为每个表单设在Web应用程序中,强烈建议每个请求使用上下文。
正如您在对Tieson T.的评论中所说,只要您访问导航属性并且conditions for lazy loading已满足,就可以依赖延迟加载,但上述反模式仍然适用。
因此,我认为您暂时可以保留应用程序代码,但请查看DbContext
API鼓励您遵守的模式。至于我,延迟加载接近于反模式。
答案 1 :(得分:1)
我将不得不寻找其他人,但State
可以通过以下方式找到:
context.Entry(yourEFobject).State
其中context
是您的DbContext
个实例。
正如@GertArnold在他的评论中提到的,EF6中的实体对象是简单的POCO,因此你无法直接从它们中读取状态等。
此答案似乎涵盖.IsLoaded
和.Load
:https://stackoverflow.com/a/13366108/534109
该答案的内容包括完整性:
context.Entry(yourEntity)
.Collection(entity => entity.NavigationProperty)
.IsLoaded;
context.Entry(yourEntity)
.Collection(entity => entity.NavigationProperty)
.Load();