获取用户操作
[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.DeferredSourceFactory1.ExecuteKeyQuery(Object[] keyValues) +258
1.Execute(Object instance)+928 System.Data.Linq.DeferredSource.GetEnumerator()+53
System.Data.Linq.DeferredSourceFactory
System.Data.Linq.EntitySet1.Load() +112
1.get_Count()+9
System.Data.Linq.EntitySet
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而不是错误。
答案 0 :(得分:1)
您应该使用视图模型。基本上,您应该在DataContext的生命周期内构建一个视图模型,并将此视图模型传递给视图结果(在您的情况下是XmlResult)。应该通过映射datacontext返回的实际域模型的属性来构造此视图模型,并且所有这些都应该在此上下文生存期内发生。 Ayende Rahien有一个很棒的series of blog posts视图模型(它适用于NHibernate,但处理上下文的问题与EF数据datacontexts完全相同)。
答案 1 :(得分:0)
您需要使用Include()
方法急切地包含子行。