我正在使用NHibernate,我遇到了一个有线问题。 我有一个实体,我保存它,之后我正在更改实体中的一个字段,并尝试更新它,但后来我得到一个异常,它无法将id更新为null,我在NHibernate探查器看到它是在face中生成SQL以将实体的id更新为null,但是,当我调试时,就在更新之前,它具有值。
这是我的代码:
// The save works.
_session.Save(entityToSave, entityToSave.Id);
_session.Flush()
entityToSave.AddedSession = new AddedSession { Date = DateTime.Now };
_session.Update(entityToSave);
_session.Flush(); // this is where i get the exception.
知道为什么吗?
实体和映射:
public class Message
{
public virtual int Id {get;set;}
public virtual AddedSession AddedSession {get;set;}
public virtual IList<MessageToUser> MessagesToUser {get;set;}
}
public class MessageMapping : ClassMap<Message>
{
Table("MESSAGES");
Id(x => x.Id).Column("ID").GeneratedBy.Sequence("MSG_SEQ");
References(x => x.AddedSession).Nullable().Column("SESSION");
HasMany(x => x.MessagesToUser).KeyColumn("ID").Cascade().SaveUpdate().Inverse();
}
public class MessageToUser
{
public virtual int Id {get;set;}
public virtual Message Message {get;set;}
}
public class MessageToUserMapping : ClassMap<MessageToUserMapping>
{
Table("MESSAGES_TO_USERS");
Id(x => x.Id).Column("ID").GeneratedBy.Sequence("MSG_USER_SEQ");
References(x => x.Message).Not.Nullable().Column("MSG_ID");
}
答案 0 :(得分:0)
scope.Commit()
代替session.Flush()
(这不是真正相关的,如果您已经这样做,只需忽略)session.Update
session
AddedSession.
您只将其添加到message
属性,但这不会使session
知道新实体。您需要先将其添加到会话中,以便进行映射。试试这个:
using (var scope = session.OpenTransaction())
{
var message = new Message();
.... // some code here
session.Save(message);
var addedSession = new AddedSession { Date = DateTime.Now };
session.Save(addedSession);
message.AddedSession = addedSession;
scope.Commit();
}