我最近在工作中继承了一个包含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>
答案 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>
检查: