首先,让我列出我想做的事情。假设我有三种EntityObject
,MetaData
,Data1
和Data2
。正如人们所料,MetaData
引用了Data1
和Data2
各一个实例。现在,对于每个MetaData
,我可以计算value
。
到目前为止这么简单。现在,我希望用户可以使用Data1
和Data2
的各种组合,并查看他们可以获得的value
。这显然需要创建MetaData
的实例。现在,如果我不想用MetaData
的所有这些条目来填充数据库,那么我想在内存中创建实体对象而不调用SaveChanges()
来编写它回到DB。但是,这会产生一个问题,即每当我尝试访问内存中Data1
的{{1}}和Data2
引用时,我都会遇到以下异常:
InvalidOperationException未处理
当相关对象处于添加状态或分离状态且最初未使用NoTracking合并选项检索时,无法返回此EntityCollection或EntityReference的源查询。
如果按照建议执行,并将对象“提交”到DB,我最终会遇到混乱问题。
无论如何,有罪的代码看起来像这样:
MetaData
似乎this guy有类似的问题。
答案 0 :(得分:11)
IsLoaded仅与已从数据库中实现的实例的属性相关。正如您所发现的那样,它不会返回尚未从数据库中实现的实例的有用信息。
因此,您应该更改测试是否要调用Load()的方式。如果您知道您将使用仅在内存中创建但未在数据库中实现的MetaData实例,那么您可以编写如下代码:
if ((temp.EntityState != System.Data.EntityState.Added) &&
(!temp.Data1Reference.IsLoaded)) temp.Data1Reference.Load();
我在这里掩饰一些细微之处。对于初学者来说,EntityState是使用FlagsAttribute声明的,因此它可以包含添加而不是相等添加。此外,如果Data1Reference为非null,则不需要这样做,因此您可能只想先测试它。关键是,你可以编写适合你情况的代码,但它必须考虑到temp的完整状态,而不仅仅是它的属性。