C# 通过AJAX编辑NHibernate记录

C# 通过AJAX编辑NHibernate记录,c#,nhibernate,asp.net-mvc-5,C#,Nhibernate,Asp.net Mvc 5,在将现有实体发布到控制器时,我无法确定如何编辑该实体。当我保存一个新的人时,它工作正常,因为没有设置Id,所以NHibernate将其视为一个新实体并将其附加到会话。然而,当我试图编辑现有实体时,MVC模型绑定器无法设置Id,即使发布的JSON已经正确设置了它。因此,即使它是一个现有实体,NHibernate仍然将其视为一个新实体,然后抛出一个异常,因为我正在对一个不在数据库或会话中的实体调用.Update() 下面是我正在使用的代码(显然,Person有更多的属性,我只是将它们保留下来以保持代

在将现有实体发布到控制器时,我无法确定如何编辑该实体。当我保存一个新的
时,它工作正常,因为没有设置
Id
,所以NHibernate将其视为一个新实体并将其附加到会话。然而,当我试图编辑现有实体时,MVC模型绑定器无法设置
Id
,即使发布的JSON已经正确设置了它。因此,即使它是一个现有实体,NHibernate仍然将其视为一个新实体,然后抛出一个异常,因为我正在对一个不在数据库或会话中的实体调用
.Update()

下面是我正在使用的代码(显然,Person有更多的属性,我只是将它们保留下来以保持代码简短)

人员类别:

public class Person
{
    public virtual int Id {get; private set;}
    //... other properties
}
正在发布到我的编辑操作的JSON

{"Id": 10}
在控制器中

public JsonResult EditPerson(Person person)
{
    Session.Update(person);
    return Json(new { success = true});
}
试一试


NHibernate使用代理加载和设置类的属性,如果setter是私有(而不是公共或受保护)代理(从映射类继承)无法访问该实体并分配从数据库加载的值。

我一直认为必须加载实体才能将其放入会话中,以便对其进行编辑

所以你需要像这样的代码

var entity = Session.Get<Entity>(entity.Id);

//make your changes
Session.Save(entity);
var entity=Session.Get(entity.Id);
//做些改变
Session.Save(实体);

我试过了,但型号活页夹仍然没有正确设置Id。我觉得这可能是MVC5的新功能?我以前做过很多次同样的事情,没有问题,但我一直使用MVC4。我好像错过了一些很明显的东西。。。但是什么?@Jedediah你的ID属性映射是什么?它是否标记为标识?#Liath,您对受保护的Id集的期望值是多少?@Liath还尝试了Id(x=>x.Id).GeneratedBy.identity(),这也没有解决问题。如何映射您的Id?这是你桌子上的主键吗?是的,很好用。不幸的是,这意味着我必须将所有域实体复制为视图模型,但如果这就是我要做的,我想这还不是世界末日。看起来很不干燥,但也许这是我唯一的选择
var entity = Session.Get<Entity>(entity.Id);

//make your changes
Session.Save(entity);