NHibernate如何将交叉参考表映射到包?

NHibernate如何将交叉参考表映射到包?,nhibernate,orm,nhibernate-mapping,Nhibernate,Orm,Nhibernate Mapping,我最近在工作中继承了一个包含NHibernate的项目。我对它非常陌生,必须对其中一个映射进行修改。我已经阅读了文档,但我仍然不确定如何做到这一点,或者我的理解/术语是否正确 因此,考虑到以下表格结构,我需要一个包来获取项目名称: User UserID (PK) ProjectUser UserID (PK, FK User.UserID) ProjectID (PK, FK Project.ProjectID) Project ProjectID (PK) Proje

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

因此,考虑到以下表格结构,我需要一个包来获取项目名称:

User
  UserID (PK)

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

Project
  ProjectID (PK)
  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>
这是现有的bag映射,它正确地返回了ProjectID,但现在我试图理解如何修改它以返回ProjectID和ProjectName:

User
  UserID (PK)

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

Project
  ProjectID (PK)
  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>

嗯,您的映射似乎是正确的,即已经返回了
项目名称。请确保对象
项目
映射如下:

<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;}
    ...
user = session.Get<User>(x) // id of searched user

foreach(var project in user.Projects)
{
  var name = project.Name;
  var id = project.Id;
  ...
}
公共类项目
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList用户{get;set;}
...
因此,有了这一点,我们应该能够使用用户:

public class User 
{
    public virtual IList<Project> Projects { get; set;}
    ...
公共类用户
{
公共虚拟IList项目{get;set;}
...
像这样由NHibernate映射和加载

public class Project 
{
    public virtual int Id { get; set;}
    public virtual string Name { get; set;}
    public virtual IList<User> Users { get; set;}
    ...
user = session.Get<User>(x) // id of searched user

foreach(var project in user.Projects)
{
  var name = project.Name;
  var id = project.Id;
  ...
}
user=session.Get(x)//搜索用户的id
foreach(user.Projects中的var项目)
{
var name=project.name;
var id=project.id;
...
}
注:

多对多
的情况下,显然可以/应该在两侧都有
映射-项目和用户。但其中只有一个可以有
inverse=“true”
。因此在这种情况下
项目。用户
没有这个映射

many-to-many
上的
cascade
设置所做的事情(很可能)与预期不同。它与配对表无关,而是与映射的第二端相关

配对对象的级联是现成的。它不必被映射,事实上它不能被映射或关闭…换句话说,我建议删除该级联,除非你真的想在持久性中更改项目,如果你与某个用户一起工作的话

同时检查:

  • 如何在没有多对多的情况下,将对象显式配对为映射实体:或

当您说“我需要修改它以返回ProjectID和ProjectName”时你的确切意思是什么?如果你想查看属于某个特定用户的所有项目名称,你只需遍历该用户的项目集合并使用Project.ProjectName。通常,你上面的关系将由两个类User和Project表示。User有一个项目和项目的集合拥有一个用户集合。在您的示例中,中间表ProjectUsers没有映射到它的C#类。是的,您是正确的,请参阅下面的答案中的我的评论。这是一个项目,基本上是在工作中被扔给我的,因为没有其他人有MVC经验,而我没有NHibernate经验,所以它主要只是一个mis理解多对多关系是如何工作的。事实证明,从项目到用户的映射是存在的,但它被注释掉了,我对NHibernate还不太熟悉,所以还不理解这一点。取消注释修复了它,但这带来了一个问题,即为什么它被注释,为什么用户包没有被更改er注释。
“在多对多的情况下,显然可以/应该在两侧进行映射”
对于一个完整的noob来说并不明显。老实说,文档有点铺天盖地,但我会根据您的链接建议对其进行修改。我知道NHibernate的弱点。坏消息是,它不会更好,根本看不到任何新的开发……但是,是的,请尝试通过existing文档…如果丢失,请毫不犹豫地在此处提出问题。我们,如何与NHibernate一起生存,将尽力帮助您;);)