2

我正在尝试使用 nHibernate 更新记录。我尝试了几种解决方案,但它们都不起作用(没有显示错误,bu 数据也没有更新)。
第一个代码:

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

第二个代码:

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();
}

我有这个批量更新返回 rowcount = 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 回答