NHibernate - 尝试将实体id更新为null

时间:2016-03-24 10:04:55

标签: c# nhibernate

我正在使用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");
}

1 个答案:

答案 0 :(得分:0)

  1. 使用交易和scope.Commit()代替session.Flush()(这不是真正相关的,如果您已经这样做,只需忽略)
  2. 无需为已与session.Update
  3. 关联的实体致电session
  4. 您的会话不知道新的AddedSession.您只将其添加到message属性,但这不会使session知道新实体。您需要先将其添加到会话中,以便进行映射。
  5. 试试这个:

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