gpt4 book ai didi

c# - Entity Framework : Working with detached objects and attached ones

转载 作者:太空狗 更新时间:2023-10-30 00:17:45 25 4
gpt4 key购买 nike

首先,让我说明一下我想做什么。假设我有三种类型的 EntityObjectMetaDataData1Data2。正如人们所期望的那样,MetaData 对每个 Data1Data2 都有一个实例的引用。现在,对于每个 MetaData,我可以计算一个 value

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

InvalidOperationException 未处理

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

如果我按照建议操作,并将对象“提交”给数据库,我最终会遇到困惑问题。

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

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();

好像this guy有类似的问题。

最佳答案

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

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

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

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

关于c# - Entity Framework : Working with detached objects and attached ones,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/389432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com