Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象在调用TryUpdateModel后从nHibernate会话断开连接_C#_Asp.net Mvc_Nhibernate - Fatal编程技术网

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
}