NHibernate如何将交叉引用表映射到包中?

时间:2014-04-16 16:44:29

标签: nhibernate orm nhibernate-mapping

我最近在工作中继承了一个包含NHibernate的项目。我对它非常新,并且必须对其中一个映射进行修改。我已阅读文档here,但我仍然不确定如何执行此操作,或者我的理解/术语是否正确。

因此,鉴于以下表格结构,我需要一个能够获得ProjectName的包:

User
  UserID (PK)

ProjectUser
  UserID (PK, FK User.UserID)
  ProjectID (PK, FK Project.ProjectID)

Project
  ProjectID (PK)
  ProjectName

这是现有的包映射,它正确返回ProjectID,但现在我试图理解我需要如何修改它以返回ProjectID和ProjectName:

<bag name="Projects" table="ProjectUser" lazy="true" inverse="true" cascade="save-update">
  <key column="UserId"></key>
  <many-to-many class="Project" column="ProjectID"></many-to-many>
</bag>

1 个答案:

答案 0 :(得分:2)

好吧,你的映射似乎是正确的,即已经返回ProjectName。请确保请检查对象Project是否映射如下:

<class name="Project" table="Project">
  <id name="Id" column="ProjectID" generator class="native"/> 

  <!-- above as the Id we have mapping for column ProjectId
        below the C# Name will contain the column ProjectName -->

  <property name="Name" column="ProjectName" />

  <!-- related Users to this Project -->
  <bag name="Users" table="ProjectUser" lazy="true" >
    <key column="ProjectID"></key>
    <many-to-many class="User" column="UserID" />
  </bag>

</class>

项目就像这样

public class Project 
{
    public virtual int Id { get; set;}
    public virtual string Name { get; set;}
    public virtual IList<User> Users { get; set;}
    ...

所以,有了这个,我们应该可以使用用户:

public class User 
{
    public virtual IList<Project> Projects { get; set;}
    ...

由NHibernate映射和加载,如此

user = session.Get<User>(x) // id of searched user

foreach(var project in user.Projects)
{
  var name = project.Name;
  var id = project.Id;
  ...
}

注意:

如果many-to-many显然可能/应该{/ 1}}双方映射 - 项目和用户。但只有其中一个可以<bag>。所以在这种情况下inverse="true"没有。

Project.Users上的cascade设置(最有可能)与人们预期的不同。它与配对表无关,而与该映射的第二端无关。

配对对象的级联是开箱即用的。它不必被映射,实际上它不能被映射或关闭......换句话说我建议删除那个级联,除非你真的想在持久性中改变项目,如果你正在与一些用户一起工作。 / p>

检查: