如何保留从已经处理过的DataContext返回的对象?

时间:2011-07-13 19:06:00

标签: asp.net-mvc datacontext dispose

获取用户操作

[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   在Dispose之后。'。

     

[ObjectDisposedException:无法访问已处置的对象。宾语   name:'Dispose后访问的DataContext。'。]   System.Data.Linq.DataContext.GetTable(Type type)+1020550
  System.Data.Linq.CommonDataServices.GetDataMemberQuery(MetaDataMember   会员,表达式[] keyValues)+120
  System.Data.Linq.DeferredSourceFactory 1.ExecuteKeyQuery(Object[] keyValues) +258
System.Data.Linq.DeferredSourceFactory
1.Execute(Object instance)+928   System.Data.Linq.DeferredSource.GetEnumerator()+53
  System.Data.Linq.EntitySet 1.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,   Object o,XmlSerializerNamespaces名称空间,String encodingStyle,   字符串ID)+646
  System.Xml.Serialization.XmlSerializer.Serialize(的TextWriter   textWriter,Object o,XmlSerializerNamespaces namespaces)+72
  System.Xml.Serialization.XmlSerializer.Serialize(的TextWriter   textWriter,Object o)+10 ...

我假设这是因为引用的对象不再存在但我该怎么办?以某种方式复制从DataContext返回的对象?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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