私はORMとしてNHibernateを使用してAsp.Net MVC 3アプリケーションを作成しています。私の編集アクションメソッドでは、DatabaseAccessObjectクラスのSaveメソッドを呼び出しますが、オブジェクトを更新する代わりに新しいメソッドを作成します。なぜ私は理解できません。Http-Post編集アクションISession.SaveOrUpdate(obj)を呼び出すと新しいエンティティが作成されます
ここに私のように構成のSessionFactoryを返すメソッドのコードだ、と私はSessionFactoryのを保存するよどこ私global.asax.csをファイル:ここでは単にラップに私DataAccessObjectから関連するスニペットは、だ
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);
}
}
をNHibernateのCRUD操作:
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);
}
:
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;
}
}
そして最後には、ここに私のHttp-ポスト編集メソッドのコードです
ご協力いただければ幸いです。
それは正確だったこと。すべてのスプリントのIDはゼロに設定されました。しかし、なぜそれがどうなるのか理解できません。私はNHibernateがデフォルトでIdの割り当てを処理するはずだったけれど。 – Vish
うん。あなたのバグは他の場所です。 –