通过AJAX编辑NHibernate记录

时间:2014-07-09 13:37:51

标签: c# nhibernate asp.net-mvc-5

在将现有实体发布到我的控制器时,我无法弄清楚如何编辑现有实体。当我保存新的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});
}

2 个答案:

答案 0 :(得分:2)

我总是觉得你必须加载实体才能进入会话,以便你可以编辑它。

所以你需要像

这样的代码
var entity = Session.Get<Entity>(entity.Id);

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

答案 1 :(得分:1)

尝试

public virtual int Id {get; protected set;}

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