C# 对象在调用TryUpdateModel后从nHibernate会话断开连接
这项工作:C# 对象在调用TryUpdateModel后从nHibernate会话断开连接,c#,asp.net-mvc,nhibernate,C#,Asp.net Mvc,Nhibernate,这项工作: public ActionResult Save(int id, string name) { var profile = _profileRepository.GetById(id); profile.Name = name; _profileRepository.Save(profile); //this calls SaveOrUpdate() //session.Commit() gets called in global.asax on A
public ActionResult Save(int id, string name)
{
var profile = _profileRepository.GetById(id);
profile.Name = name;
_profileRepository.Save(profile); //this calls SaveOrUpdate()
//session.Commit() gets called in global.asax on Application_EndRequest()
//profile.Name is changed in the database
}
因为我的实际问题比这个简单的例子更复杂,所以我想从repo获取概要文件,在概要文件上使用TryUpdateModel来更新任何更改,然后保存。但是,当我将TryUpdateModel引入混合时,它失败了,出现了一个ununiqueObjectException(具有相同标识符值的另一个对象已经与会话关联):
具有相同标识符值的“不同”对象??看起来TryUpdateModel正在断开我的配置文件对象与会话的连接。有什么想法吗?第一个示例会起作用,因为您正在更新通过NHibernate会话检索到的相同对象 第二个示例可能会失败,因为TryUpdateModel()可能会替换配置文件对象的属性(如果存在匹配的ValueProvider数据)。如果您碰巧回发了其中一个属性(包括Id)的数据,TryUpdateModel()方法可能会替换最初通过NHibernate会话检索到的一个对象。当您尝试保存配置文件时,NHibernate将识别出您没有编辑原始对象,但正在尝试使用完全相同的Id保存不同的对象。这将导致UnuniqueObjectException
要解决此问题,应确保正在更新从会话检索的原始实体的值。我建议您避免直接对域中的实体使用DefaultModelBinder,您希望对其执行更改跟踪。您的实体ID在此TryUpdateModel上更新了吗?实体ID与TryUpdateModel之前保持不变。
public ActionResult Save(int id)
{
var profile = _profileRepository.GetById(id);
TryUpdateModel(profile); //this works from the looks of it
_profileRepository.Save(profile); //this also appears to work;
//fails on session.Commit()
//nothing changed in database
}