2012-05-01 38 views
2

我有两个表与桥表有多对多的关系。Nhibernate多对多桥表保留为空

用户类别映射:

<class name="MatrixCore.User" table="MatrixUser" lazy="false"> 
    <id name="ID" column="ID" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <property name="FirstName"/> 
    <property name="LastName"/> 
    <property name="UserName"/> 
    <property name="Password"/> 
    <many-to-one name="UserType" class="MatrixCore.UserType" /> 
    <set name="Projects" table="UserInProject" cascade="All"> 
     <key column="MatrixUser_ID"/> 
     <many-to-many class="Project" column="Project_ID"/> 
    </set> 
    </class> 

项目类映射:

<class name="MatrixCore.Project" table="Project" lazy="false"> 
    <id name="ID" column="ID" unsaved-value="0"> 
    <generator class="native"/> 
    </id> 
    <property name="Name" /> 
    <property name="Acronym"/> 
    <property name="StartDate"/> 
    <property name="EndDate"/> 
    <set name="Users" table="UserInProject" cascade="All"> 
    <key column="Project_ID"/> 
    <many-to-many class="User" column="MatrixUser_ID" /> 
    </set> 
</class> 

的类的实现是过于简单每个类有一个集合的其他的 。 我试图在表中插入记录桥表保持为空。

ICollection<Project> ps = new HashSet<Project>() { project}; 

      UserType tp = (UserType)session.Get("UserType", 1); 
      User u = new User() 
      { 
       FirstName = "Hussein", 
       LastName = "Hussein", 
       UserName = "Hussein", 
       Password = "welcome", 
       UserType = tp, 
       Projects = ps 
      }; 

      session.Save(u); 
+0

你真的应该创建一个临时表(ProjectUsers)引用项目和用户预防nt多对多的关系:) – mattytommo

+0

有一张表重读映射请求:) –

回答

2

试试这个映射 用户类

<set name="Projects" table="UserInProject" inverse="true" cascade="save-update" lazy="false"> 
    <key column="MatrixUser_ID" /> 
    <many-to-many class="Project" column="Project_ID"/> 
</set> 

和项目

<set name="Users" table="UserInProject" cascade="save-update" lazy="false"> 
    <key column="Project_ID" /> 
    <many-to-many class="User" column="MatrixUser_ID"/> 
</set> 
+0

谢谢sleiman它的工作原理很好,你可以解释反向属性如何解决问题我有点愣住了。 –

+2

[这会有所帮助](http://stackoverflow.com/questions/713637/inverse-attribute-in-nhibernate) –

0

您需要将用户添加到Users财产在Projects的每一个。

添加下面的循环之前Save -

foreach (Project project in u.Projects) 
{ 
    project.Users.Add(u); 
} 
+0

不,这不是问题 –