2011-09-16 106 views
0

使用NHibernate,我该如何让user.AddPost(post)post.setAuthor(user)的行为方式相同?NHibernate中的双向一对多关联

这里是我的课:

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

您是否尝试在创建用户的同一个过程中创建一个帖子?如果它是实体,我会在用户中创建一个帖子。新用户{.. new Post {} ..} – Independent

+0

@Jonas:嗯,我刚刚开始学习NHibernate,我有点困惑,虽然这两种方法都很好,编译和运行,只是有不同的结果。更具体地说,我要么需要使两种方法都能正常工作,要么为第二种方法(不工作),我希望至少得到运行时错误,所以我发现它并没有达到我期望的效果去做。 – agibalov

回答

3

我认为它失败了,因为作者列上的NOT NULL约束?您不要在Post中设置Author属性,因此NHibernate会在外键列中插入NULL。

如果您需要双向关系,请创建一个User.AddPost(Post)方法,其中将帖子添加到集合并设置其Author属性。

如果你只需要在你的代码(但不是Author参考)的集合,只是删除Author财产(及其映射),删除你收集映射inverse="true"并添加not-null="true"到您的收藏映射的key元素。那样,收集将处理从PostUser的参考。

1

据我了解,您需要为用户实体设置级联选项。