我最近继承了一个包含 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>
好吧,您的映射似乎是正确的,即已经返回了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;}
...
因此,有了这个,我们应该能够使用 User:
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;
...
}
NOTES:
的情况下many-to-many
显然可以/应该有<bag>
两侧映射 - 项目和用户。但只有其中一个人可以拥有inverse="true"
。所以在这种情况下Project.Users
没有那个。
The cascade
设置为many-to-many
正在做(很可能)与人们预期不同的事情。它与配对表无关,而是与该映射的第二端相关。
配对对象的级联是开箱即用的。它不必被映射,事实上它不能被映射或关闭...换句话说,我建议删除该级联,除非您真的想持久地更改项目,如果您正在与某些用户一起工作。
还检查:
- 23.2.作者/作品
- 如何在没有多对多的情况下做到这一点......使用显式配对对象作为映射实体:Nhibernate:如何用一对多关系表示多对多关系? or 使用流畅的 nhibernate 时,我是否错误地执行了多对多操作?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)