2016-03-24 8 views
0

NHibernateを使用していますが、有線の問題を抱えています。 エンティティを持っていて、それを保存した後、エンティティのフィールドを変更して更新しようとしましたが、IDをnullに更新できないという例外が発生しました。NHibernateプロファイラで確認できますそれが直面しているのは、エンティティのIDをnullに更新するためのSQLを生成しますが、デバッグするときは更新の直前に値を持ちます。ここでNHibernate - エンティティ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

申し訳ありません、iveはそれらを追加しました – Pachu

+0

'AddedSession'は表示されません。明示的にコードスニペットに保存されておらず、 'Message.AddedSession'マッピングにカスケードセットがありません。おそらく、InnerExceptionを含む完全な例外エラーメッセージと、あなたの問題を理解するのを助けるために目撃した生成されたSQLを含めるべきでしょうか。 –

答えて

0
  1. 使用取引とscope.Commit()の代わりに、session.Flush()(これは実際には関係ありません、あなたはすでにちょうど無視し、それを行う場合)
  2. session.Updateをコールする必要はありません既にリンクされているエンティティの場合session
  3. あなたはセッションが新しいことについて知りません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(); 
} 
関連する問題