在将现有实体发布到我的控制器时,我无法弄清楚如何编辑现有实体。当我保存新的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});
}
答案 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是私有的(而不是公共的或受保护的)代理(从你的映射类继承)无法访问它并分配它从数据库加载的值