当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《实体框架:使用分离的对象和附加的对象》经验,为你挑选了1个好方法。

首先,让我列出我想做的事情.假设我有三种EntityObject,MetaData,Data1Data2.MetaData正如人们所期望的那样,是对每个Data1和的一个实例的引用Data2.现在,对于每一个MetaData,我可以计算一个value.

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

InvalidOperationException未处理

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

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

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

MetaData temp = MetaData.CreateMetaData(0);

MetaData.Data1 = ;
MetaData.Data2 = ;

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

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



1> Craig Stuntz..:

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

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

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

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


*"EntityState使用FlagsAttribute声明,因此它可以包含Added而不等于添加"* - 那么它不应该是`(temp.EntityState&EntityState.Added)!= EntityState.Added`?
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有