NHibernate中的双向一对多关联

时间:2011-09-16 05:39:08

标签: c# .net nhibernate nhibernate-mapping

使用NHibernate,我如何使user.AddPost(post)post.setAuthor(user)的行为方式相同?

以下是我的课程:

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

2 个答案:

答案 0 :(得分:3)

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

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

如果您只需要代码中的集合(但不需要Author引用),只需删除Author属性(及其映射),删除集合映射的inverse="true"并将not-null="true"添加到集合映射的key元素中。这样,该集合将处理从PostUser的引用。

答案 1 :(得分:1)

据我所知,您需要为User实体设置级联选项。