2011-09-16 20 views
0

NHibernateで、user.AddPost(post)post.setAuthor(user)の両方が同じように動作するようにするにはどうすればよいですか?ここでNHibernateにおける双方向の1対多関連

は私のクラスです:

ここ
public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int Age { get; set; } 

    private ICollection<Post> _posts = new HashSet<Post>(); 
    public virtual ICollection<Post> Posts 
    { 
     get { return _posts; } 
     set { _posts = value; } 
    } 

    public override string ToString() 
    { 
     return string.Format("User{{id={0}, name='{1}', age={2}}}", Id, Name, Age); 
    } 
} 

public class Post 
{ 
    public virtual int Id { get; set; } 
    public virtual string Text { get; set; } 
    public virtual User Author { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Post{{id={0}, text='{1}', author={2}}}", Id, Text, Author); 
    } 
} 

は私のマッピングです:

<class name="User" table="users"> 
    <id name="Id" type="int"> 
    <column name="Id" not-null="true" /> 
    <generator class="native"/> 
    </id> 
    <property name="Name" column="Name" /> 
    <property name="Age" column="Age" /> 
    <set name="Posts" inverse="true"> 
    <key column="AuthorId" /> 
    <one-to-many class="Post" /> 
    </set> 
</class> 

<class name="Post" table="posts"> 
    <id name="Id" type="int"> 
    <column name="Id" not-null="true" /> 
    <generator class="native"/> 
    </id> 
    <property name="Text" column="Text" /> 
    <many-to-one name="Author" column="AuthorId" class="User" /> 
</class> 

実行されるコード(正常に動作します):

var user = new User { 
    Name = "loki2302", 
    Age = 100 
}; 
session.Save(user); 

var post = new Post { 
    Text = "qwerty", 
    Author = user 
}; 
session.Save(post); 

は、それはまた、に可能ですこの方法を有効にする(機能しない):

var user = new User { 
    Name = "loki2302", 
    Age = 100 
}; 
session.Save(user); 

var post = new Post { 
    Text = "qwerty" 
}; 
user.Posts.Add(post); 
session.save(user); 

+0

ユーザーを作成するのと同じプロセスで投稿を作成しようとしていますか?それがエンティティの場合は、ユーザーの内部に投稿を作成します。 – Independent

+0

@Jonas:NHibernateの学習を始めたばかりですが、どちらの方法もコンパイルと実行がうまくいきますが、ちょっと違うのはちょっと混乱しています。具体的には、両方のアプローチをうまく動作させる必要があるか、2番目のアプローチ(動作していない)に対して少なくともランタイムエラーが発生するようにする必要があります。する。 – agibalov

答えて

3

著者カラムのNOT NULL制約のために失敗すると思いますか? PostAuthorプロパティを設定しないため、NHibernateは外部キー列にNULLを挿入します。

双方向の関係が必要な場合は、User.AddPost(Post)メソッドを作成し、コレクションに投稿を追加し、Authorプロパティを設定します。

あなただけのコードでコレクション(ただしAuthor参照)が必要な場合は、単に、Authorプロパティ(およびそのマッピング)を削除しますコレクション・マッピングのinverse="true"を削除し、あなたのコレクションのマッピングのkey要素にnot-null="true"を追加。そうすれば、コレクションはPostからUserへの参照を扱います。

1

私が理解する限り、ユーザーエンティティのカスケードオプションを設定する必要があります。

関連する問題