gpt4 book ai didi

c# - "The ObjectContext instance has been disposed"用于非 EF 实体

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:08 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 6 通过返回 Complex 对象的存储过程来查询一些对象。在将这些对象返回给客户端之前,我将它们“翻译”成客户端特定的实体。

在服务器端,我有以下代码从数据库中获取 DBMeeting 类型的复杂对象:

public static IEnumerable<Meeting> GetMeetings()
{
using(var context = new MyDataContext())
{
var dbMeetings = context.GetMeetings(null, null);
var result = ComplexToEntityTranslator.TranslateMeetings(dbMeetings);
return result;
}
}

TranslateMeetings 方法:

internal static IEnumerable<Meeting> TranslateMeetings(IEnumerable<DBMeeting> dbMeetings)
{
foreach (var dbMeeting in dbMeetings)
{
yield return TranslateMeeting(dbMeeting);
}
}

internal static Meeting TranslateMeeting(DBMeeting dbMeeting)
{
return new Meeting
{
Id = dbMeeting.ID,
Name = dbMeeting.Name,
Description = dbMeeting.Description
// other properties
};
}

现在在客户端,当我调用 GetMeetings() 并尝试枚举列表时,我得到一个 InvalidOperationException 说:

ObjectContext 实例已被释放,不能再用于需要连接的操作。

我特别不想在服务器端运行 .ToList(),因为我希望枚举发生在客户端。然而,在我的 TranslateMeetings() 方法中,我创建了 new Meeting 对象,这些对象没有以任何方式映射到我的模型。那么为什么它要求上下文仍然存在呢?为什么 EF 试图跟踪非映射(Meeting)对象?

最佳答案

问题是 Entity Framework 使用延迟评估。除非万不得已,否则它不会尝试从数据库中取出对象。

此外,通过在 TranslateMeetings 方法中使用 yield return,您可以在那里使用延迟计算。该方法中的代码只有在您实际对其进行迭代后才会运行。

因此,当您返回 result 时,仍未对数据库进行调用。稍后,当您尝试遍历 result 时,TranslateMeetings 方法将尝试遍历 dbMeetings 对象。这将触发 Entity Framework 执行 SQL 并尝试填充 dbMeetings。但此时上下文已被处理掉,因此调用失败。

我知道您说过您不想运行 .ToList(),但这正是您必须要做的。在处理上下文之前,您不能推迟评估!客户端(我假设这是一个 API?)不能是执行 Entity Framework 的人。它只是不那样工作。客户端需要接收填充的对象。

关于c# - "The ObjectContext instance has been disposed"用于非 EF 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25728414/

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