繁体   English   中英

实体框架:使用分离的对象和附加的对象

[英]Entity Framework: Working with detached objects and attached ones

首先,让我列出我想做的事情。 假设我有三种类型的EntityObjectMetaDataData1Data2 正如人们所料, MetaData具有对Data1Data2各一个实例的引用。 现在,对于每个MetaData ,我可以计算一个value

到目前为止这么简单。 现在,我希望用户可以使用Data1Data2各种组合,并查看它们可以获得的value 这显然需要创建MetaData实例。 现在,如果我不想用MetaData所有这些条目来填充数据库,那么我想在内存中创建实体对象而不调用SaveChanges()将其写回到DB。 但是,这会产生一个问题,即每当我尝试访问内存中MetaDataData1Data2引用时,我最终会MetaData以下异常:

InvalidOperationException未处理

当相关对象处于添加状态或分离状态且最初未使用NoTracking合并选项检索时,无法返回此EntityCollection或EntityReference的源查询。

如果我按照建议做,并将对象“提交”到DB,我最终会遇到混乱问题。

无论如何,有罪的代码看起来像这样:

MetaData temp = MetaData.CreateMetaData(0);

MetaData.Data1 = <existing Data1 from context>;
MetaData.Data2 = <existing Data2 from context>;

//Exception here
if (!MetaData.Data1Reference.isLoaded)
    MetaData.Data1Reference.Load();

看来这家伙有类似的问题。

IsLoaded仅与已从数据库实现的实例的属性相关。 正如您所发现的,它不会返回尚未从数据库中实现的实例的有用信息。

因此,您应该更改测试是否要调用Load()的方式。 如果您知道您将使用仅在内存中创建但未在数据库中实现的MetaData实例,那么您可以编写如下代码:

if ((temp.EntityState != System.Data.EntityState.Added) && 
    (!temp.Data1Reference.IsLoaded)) temp.Data1Reference.Load();

我在这里掩饰一些细微之处。 对于初学者,EntityState使用FlagsAttribute声明,因此它可以包含 Added而不等于 Added。 此外,如果Data1Reference为非null,则不需要这样做,因此您可能只想先测试它。 关键是,您可以编写适合您情况的代码,但它必须考虑完整的temp状态,而不仅仅是其属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM