Nhibernate Http Post edit操作调用ISession.SaveOrUpdate(obj)创建新实体

Nhibernate Http Post edit操作调用ISession.SaveOrUpdate(obj)创建新实体,nhibernate,asp.net-mvc-3,Nhibernate,Asp.net Mvc 3,我正在创建一个Asp.NETMVC3应用程序,其中NHibernate作为我的ORM。在我的编辑操作方法中,我在DatabaseAccessObject类中调用了Save方法,但它没有更新对象,而是创建了一个新的对象。我不明白为什么 下面是返回配置的SessionFactory和存储SessionFactory的global.asax.cs文件的方法的代码: public static ISessionFactory CreateSessionFactory() {

我正在创建一个Asp.NETMVC3应用程序,其中NHibernate作为我的ORM。在我的编辑操作方法中,我在DatabaseAccessObject类中调用了Save方法,但它没有更新对象,而是创建了一个新的对象。我不明白为什么

下面是返回配置的SessionFactory和存储SessionFactory的global.asax.cs文件的方法的代码:

public static ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString("Server=(local);Database=WebApplicationPbiBoard;Trusted_Connection=True;"))
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<WebApplicationPbiBoard.Models.ScrumModels_Mappings.PbiMap>())
                .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
                .CurrentSessionContext("web")
                .BuildSessionFactory();
        }

public class MvcApplication : System.Web.HttpApplication
{
    public static ISessionFactory SessionFactory { get; private set; }
    protected void Application_Start()
    {
        //my additions
        SessionFactory = NHibernateConfigurator.CreateSessionFactory();
    }

    protected void Application_OnEnd()
    {
        SessionFactory.Dispose();
    }

    protected void Application_BeginRequest()
    {
        ISession session = SessionFactory.OpenSession();

        CurrentSessionContext.Bind(session);
    }

    protected void Application_EndRequest()
    {
        CurrentSessionContext.Unbind(SessionFactory);
    }
}
公共静态ISessionFactory CreateSessionFactory()
{
流畅地返回。Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(“服务器=(本地);数据库=WebApplicationPbiBoard;可信连接=True;”)
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(cfg=>newschemaupdate(cfg).Execute(false,true))
.CurrentSessionContext(“web”)
.BuildSessionFactory();
}
公共类MVC应用程序:System.Web.HttpApplication
{
公共静态ISessionFactory会话工厂{get;private set;}
受保护的无效应用程序\u Start()
{
//我的补充
SessionFactory=NHibernateConfigulator.CreateSessionFactory();
}
受保护的无效应用程序_OnEnd()
{
SessionFactory.Dispose();
}
受保护的无效应用程序_BeginRequest()
{
ISession session=SessionFactory.OpenSession();
CurrentSessionContext.Bind(会话);
}
受保护的无效应用程序\u EndRequest()
{
CurrentSessionContext.Unbind(会话工厂);
}
}
下面是我的DataAccessObject中的相关片段,它简单地包装了NHibernate CRUD操作:

public class DatabaseAccessObject<T> where T : class
    {
        private readonly ISession session = MvcApplication.SessionFactory.GetCurrentSession();
        private ISession Session { get { return session; } }

        public T Save(T obj)
        {
            ITransaction transaction = null;
            try
            {
                transaction = Session.BeginTransaction();

                Session.SaveOrUpdate(obj);
                transaction.Commit();
                return obj;
            }
            catch (Exception ex)
            {
                if (transaction != null && transaction.IsActive)
                    transaction.Rollback();

                throw;
            }
        }
公共类数据库访问对象,其中T:class
{
私有只读ISession session=mvcapapplication.SessionFactory.GetCurrentSession();
专用ISession会话{get{return Session;}}
公共T保存(T obj)
{
ITransaction事务=null;
尝试
{
事务=Session.BeginTransaction();
会话。保存或更新(obj);
Commit();
返回obj;
}
捕获(例外情况除外)
{
if(transaction!=null&&transaction.IsActive)
transaction.Rollback();
投掷;
}
}
最后,这里是我的Http Post编辑方法的代码:

private readonly DatabaseAccessObject<Sprint> db = new DatabaseAccessObject<Sprint>();
private DatabaseAccessObject<Sprint> Db { get { return db; } }

[HttpPost]
public ActionResult Edit(Sprint editedSprint)
{
    if (ModelState.IsValid)
    {
        Db.Save(editedSprint);
        return RedirectToAction("Index");
    }
    else
        return View(editedSprint);            
 }
private readonly DatabaseAccessObject db=new DatabaseAccessObject();
私有数据库访问对象数据库{get{return Db;}}
[HttpPost]
公共操作结果编辑(Sprint编辑Sprint)
{
if(ModelState.IsValid)
{
Db.Save(editedSprint);
返回操作(“索引”);
}
其他的
返回视图(editedSprint);
}

任何帮助都将不胜感激。

您正在保存的对象可能没有设置Id

SaveOrUpdate执行以下两项操作之一: -如果设置了Id,则更新()。 -如果未设置Id,则保存()

请参阅以下文件:

就是这样。每个Sprint的Id都设置为零。但我不明白为什么会是这样。我认为默认情况下NHibernate应该负责分配Id。是的。你的bug在其他地方。