2

nHibernateでレコードを更新しようとしています。私はいくつかの解決策を試しましたが、どれも機能しません(エラーは表示されず、buデータは更新されません)。
最初のコード:

MyRepository rep = new MyRepository(GetCurrentSession());
UserPost post = rep.GetById(id);
post.ValidTo = date;
rep.Update(post);

2番目のコード:

ISession session = GetCurrentSession();
MyRepository rep = new MyRepository(GetCurrentSession());
UserPost post = rep.GetById(id);
post.ValidTo = date;
rep.Update(post);
session.Update(post);
session.Transaction.Commit();
session = null;

多分誰かが提案を持っていますか?

4

4 に答える 4

6

1)トランザクションを使用していない場合は、セッションをフラッシュする必要があります`:

var post = _session.Load<Post>(id); //assumes this record exists in the db
post.SomeAttribute=somenewvalue;
_session.SaveOrUpdate(post);
_session.Flush;

2)トランザクションが開始されていないのですか?コミットするにはトランザクションを開始する必要があります。

using(var transaction = _session.BeginTransaction()){
   _session.SaveOrUpdate(post);
   transaction.commit();
}
于 2012-05-02T13:24:44.257 に答える
3
using(var transaction = _session.BeginTransaction()){
   _session.SaveOrUpdate(post);
   transaction.commit();
}

このバッチ更新で行数=0が返されましたが、1つの例外が予想されます。しかし、これは機能します

于 2013-03-02T06:58:12.390 に答える
2

正しくUserPostマッピングされていますか?ファイルを使用していて.hbm.xml(hbmに注意)、xmlファイルは埋め込みリソースとしてマークされていますか?

ここに画像の説明を入力してください

私の経験では、エンティティがマップされていない場合、NHibernateは文句を言ったりエラーをスローしたりしません。

実際にあなたが呼んでいないあなたのコードをより詳細に見るsession.Save

于 2012-05-02T13:20:13.420 に答える
0

一部の永続エンティティのフィールドを更新する場合は、session.Update()またはsession.SaveOrUpdate()を呼び出さないでください。session.Flush()またはトランザクションを使用できます。

MyRepository rep = new MyRepository(GetCurrentSession());
UserPost post = rep.GetById(id);
post.ValidTo = date;
rep.Flush(); // session.Flush()

OR

using(var transaction = _session.BeginTransaction()){
   UserPost post = rep.GetById(id);
   post.ValidTo = date;
   transaction.commit();
}
于 2012-05-02T13:53:55.970 に答える