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