【问题标题】:How can I keep an object that was returned from an already disposed of DataContext?如何保留从已处理的 DataContext 返回的对象?
【发布时间】:2011-07-13 19:05:59
【问题描述】:

获取用户操作

[HttpGet]
[ActionName("Index")]
public ActionResult Get(int id)
{
    User u = UserCore.GetUser(id);

    if (u == null)
        return Content("user not found", "text/plain");

    return new XmlResult(u);
}

UserCore.GetUser

public static User GetUser(int UserID)
{
    using (PanamaDataContext db = new PanamaDataContext())
    {
        return (from u in db.Users where u.UserID == UserID select u).FirstOrDefault();
    }
}

路线

routes.MapRoute(
    "GetUser",
    "user/{id}",
    new { controller = "Users", action = "Index" }
);

最后是测试网址

/user/9000 按预期返回“未找到用户”(当前不存在)

/user/75(实际上存在于数据库中)但是返回:

无法访问已处置的对象。对象名称:'DataContext 已访问 处理后。'。

[ObjectDisposedException:无法访问已处置的对象。目的 name: '在 Dispose 后访问的 DataContext。'。]
System.Data.Linq.DataContext.GetTable(类型类型) +1020550
System.Data.Linq.CommonDataServices.GetDataMemberQuery(MetaDataMember 成员,Expression[] keyValues) +120
System.Data.Linq.DeferredSourceFactory1.ExecuteKeyQuery(Object[] keyValues) +258
System.Data.Linq.DeferredSourceFactory
1.Execute(对象实例) +928 System.Data.Linq.DeferredSource.GetEnumerator() +53
System.Data.Linq.EntitySet1.Load() +112
System.Data.Linq.EntitySet
1.get_Count() +9
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterUser.Write14_User(字符串 n, String ns, User o, Boolean isNullable, Boolean needType) +5060
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterUser.Write15_User(对象 o) +144

[InvalidOperationException: 生成 XML 时出错 文件。]
System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, 对象 o、XmlSerializerNamespaces 命名空间、字符串 encodingStyle、 字符串 id) +646
System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter、Object o、XmlSerializerNamespaces 命名空间)+72
System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, 对象 o) +10 ...

我假设这是因为引用的对象不再存在,但我该怎么办?不知何故复制从 DataContext 返回的对象?

无论哪种方式,它都应该返回 XML 而不是那个错误。

【问题讨论】:

    标签: asp.net-mvc datacontext dispose


    【解决方案1】:

    您应该使用视图模型。基本上,您应该在 DataContext 的生命周期内构造一个视图模型,并将此视图模型传递给视图结果(在您的情况下为 XmlResult)。这个视图模型应该通过映射你的数据上下文返回的实际域模型的属性来构建,所有这些都应该在这个上下文生命周期内发生。 Ayende Rahien 有一个很棒的 series of blog posts 关于视图模型(它适用于 NHibernate,但处置上下文的问题与 EF 数据数据上下文完全相同)。

    【讨论】:

    【解决方案2】:

    您需要使用Include() 方法急切地包含子行。

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2020-06-26
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多