NHibernate如何将交叉参考表映射到包?
我最近在工作中继承了一个包含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
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一起生存,将尽力帮助您;);)