2011-08-13 3 views
0

私は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-ポスト編集メソッドのコードです

ご協力いただければ幸いです。

答えて

2

保存しているオブジェクトにはおそらくIDが設定されていません。

SaveOrUpdateは、次の2つのうちのいずれかを行います。 - IDが設定されている場合はUpdate()。 - Idが設定されていない場合はSave()を行います。

は、ドキュメントを参照してください。 http://www.nhforge.org/doc/nh/en/index.html

+0

それは正確だったこと。すべてのスプリントのIDはゼロに設定されました。しかし、なぜそれがどうなるのか理解できません。私はNHibernateがデフォルトでIdの割り当てを処理するはずだったけれど。 – Vish

+0

うん。あなたのバグは他の場所です。 –

関連する問題