Asp.net mvc 3 NHibernate+;MVC3编辑操作结果-行已更新或删除/StaleObjectException

Asp.net mvc 3 NHibernate+;MVC3编辑操作结果-行已更新或删除/StaleObjectException,asp.net-mvc-3,nhibernate,Asp.net Mvc 3,Nhibernate,为什么给我的ASP.NET MVC3Edit操作一个新对象而不是要编辑的对象? 当我检查给定对象的属性时,ID值是我在NHibernate映射文件中指定的未保存值 为了解决这个问题,我可以从数据库中查询回要更新的对象,并从传递给方法的对象中设置我想要的属性。但是,对于一个具有一个或两个属性的非常简单的对象来说,这是可行的,但当有很多属性时,它很快就会成为一个问题,并且看起来我在与系统作斗争(对我来说,这表明我没有按照应该做的方式做事情) 我的映射: <id name="Id" column

为什么给我的ASP.NET MVC3
Edit
操作一个新对象而不是要编辑的对象?
当我检查给定对象的属性时,ID值是我在NHibernate映射文件中指定的
未保存值

为了解决这个问题,我可以从数据库中查询回要更新的对象,并从传递给方法的对象中设置我想要的属性。但是,对于一个具有一个或两个属性的非常简单的对象来说,这是可行的,但当有很多属性时,它很快就会成为一个问题,并且看起来我在与系统作斗争(对我来说,这表明我没有按照应该做的方式做事情)

我的映射:

<id name="Id" column="Id" type="Guid" 
    unsaved-value="00000000-0000-0000-0000-000000000000">
编辑
我已经看过了,但这和我已经做的差不多,我不敢相信更新方法会像我尝试的那样混乱


我也看过;它看起来与我的问题相同,但我无法得到任何对我有用的答案,这就是问题仍然存在。

提供给action方法的
状态
实例是由MVC的model binder生成的-它是一个新对象,因为model binder和NHibernate彼此一无所知。要使其具有正确的ID,您需要将ID作为表单的一部分提供(隐藏)。但请注意,用户不能通过发布超过表单包含的字段或更改隐藏字段的值来进行未经授权的更改


有不同的型号是很常见的。MVC在前端使用视图模型,这些视图模型有不同的用途,并且看起来不一定与您的域模型相同。action方法负责对视图模型中的值进行操作,并对域模型执行正确的操作。

提供给action方法的
状态
实例是由MVC的model binder生成的-它是一个新对象,因为model binder和NHibernate互不了解。要使其具有正确的ID,您需要将ID作为表单的一部分提供(隐藏)。但请注意,用户不能通过发布超过表单包含的字段或更改隐藏字段的值来进行未经授权的更改


有不同的型号是很常见的。MVC在前端使用视图模型,这些视图模型有不同的用途,并且看起来不一定与您的域模型相同。action方法负责对视图模型中的值进行操作,并对域模型执行正确的操作。

我无法向Oskers应答添加任何应标记为正确的内容。就几点

在原始方法中,当Ayende的属性创建事务时,您不需要update语句,NHibernate将看到属性已更改,并为您更新它

如果您觉得第二种方法是可行的,那么可以通过创建自定义模型绑定器来实现这一点,该绑定器将加载到Nhibernate对象中

见:

我真的无法在Oskers答案中添加任何应该标记为正确的内容。就几点

在原始方法中,当Ayende的属性创建事务时,您不需要update语句,NHibernate将看到属性已更改,并为您更新它

如果您觉得第二种方法是可行的,那么可以通过创建自定义模型绑定器来实现这一点,该绑定器将加载到Nhibernate对象中

见:

我已经试用了Jimmy Bogard的自定义模型绑定器,但我还没有在任何实际代码中真正使用它。我已经试验了Jimmy Bogard的定制模型绑定器,但我还没有在任何实际代码中真正使用它。啊。。。我的表单中有一个隐藏的Id字段,但是Id是一个在抽象基类上定义的
受保护的
字段,并且没有setter机制。其思想是,任何东西都不能随意更改实体的Id值。所以我猜现在发生的事情是MVC模型绑定器无法在它从表单控件创建的对象上设置Id值。有时我使用一种模式,只有在尚未设置Id的情况下才能设置Id。通常这类似于(_id==0(或null))抛出InvalidOperationException(…)啊。。。我的表单中有一个隐藏的Id字段,但是Id是一个在抽象基类上定义的
受保护的
字段,并且没有setter机制。其思想是,任何东西都不能随意更改实体的Id值。所以我猜现在发生的事情是MVC模型绑定器无法在它从表单控件创建的对象上设置Id值。有时我使用一种模式,只有在尚未设置Id的情况下才能设置Id。通常这类似于(_id==0(或null))抛出InvalidOperationException(…)
[NHibernateActionFilter]
[HttpPost]
public ActionResult Edit(Status status, Guid id)
{
    try
    {
        if (ModelState.IsValid)
        {
            var originalStatus = Session.QueryOver<Status>()
                                        .Where(s => s.Id == id)
                                        .SingleOrDefault<Status>();
            if (originalStatus == null)
                throw new Exception(string.Format("No Status with Id: {0}.", id));

            originalStatus.StatusName = status.StatusName;
            Session.Update(originalStatus );

            return RedirectToAction("Index");
        }
    }
    catch (DataMisalignedException ex)
    {
        // TODO: Log4Net this
        ModelState.AddModelError("", "Unable to save changes. Please try again.");
    }
    return View(status);
}
[NHibernateActionFilter]
[HttpPost]
public ActionResult Edit(Status status)
{
    try
    {
        if (ModelState.IsValid)
        {
            Session.Update(status);

            return RedirectToAction("Index");
        }
    }
    catch (DataMisalignedException ex)
    {
        // TODO: Log4Net this
        ModelState.AddModelError("", "Unable to save changes. Please try again.");
    }
    return View(status);
}