2010-12-21 99 views
1

我们在我们的系统上有用户。每个用户有很多人员。但是,当用户登录时,我们需要仰望他的主要人员记录填写自己的姓名,地址,电话等流利的NHibernate:如何在两个方向上都有一对多的参考?

public class Person 
{ 
    /// <summary>Every Person belongs to a user.</summary> 
    public virtual User User { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string Address { get; set; } 
    public virtual string Phone { get; set; } 
    // More methods & Properties 
} 

public class User : Entity 
{ 
    public virtual string Username { get; set; } 
    public virtual string Password { get; set; } 
    /// <summary>Every User has a primary person record.</summary> 
    public virtual Person PrimaryPerson { get; set; } 
    // More methods & Properties 
} 

如何在类图的外观为这个没有一个循环引用?

+0

因此,用户与Person有一对多的关系,并且User有一个Primary Person。 – Phill 2010-12-21 02:38:02

+0

这是正确的,菲尔。一个用户将有许多人。但这些人中只有一人是主人。 – Rap 2010-12-21 02:39:50

+0

可能我错过了一些东西,但为什么你不能在'UserMap'上的'PersonMap'和'References(x => x.PrimaryPerson)'''References(x => x.User)'? NHibernate基本上可以看到这些是单独的一对多关系(因为'User'不存储'ICollection SecondaryPersons'这里没有双向性),这意味着你必须自己执行约束,但这是一个大问题吗?我想这有一个循环引用,但......你的域类也是如此。 – fostandy 2010-12-22 05:38:07

回答

4

试试这个:

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
    Table("Persons"); 
    Id(x =>x.Id, "PersonId").GeneratedBy.Identity(); 
    References(x => x.User).Column("UserId").Cascade.All(); 
    Map(x => x.FirstName, "FirstName"); 
    Map(x => x.LastName, "LastName"); 
    Map(x => x.Address, "Address"); 
    Map(x => x.Phone, "Phone"); 
    // More property maps 
    } 
} 

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
    Id(x => x.Id, "UserId").GeneratedBy.Identity(); 
    Map(x => x.Username, "Username"); 
    Map(x => x.Password, "Password"); 
    References<Person>(x => x.PrimaryPerson).ForeignKey("PrimaryPersonId").Cascade.All(); 
    } 
} 

这是假设你的ID是自动编号,并且当你更新的用户,你也想将随之更新您的PrimaryPerson。如果不是这种情况,请将Cascade.All()更改为Cascade.None()。只要确保当你这样做时,你手动更新PrimaryPerson,或者如果你不这样做,你会得到一个“对象引用一个未保存的瞬态实例”在SubmitChanges()上。

+0

正是我们需要的。完美的作品。谢谢。 – Rap 2010-12-23 20:42:21

0

根据我对你的问题的评论,我觉得映射是沿着线的东西:

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(x => x.Id)... 
     ... 
     References(x => x.User).Inverse(); // User references Person 
    } 
} 

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.Id)... 
     ... 
     References(x => x.PrimaryPerson).Column("PrimaryPersonId")... 
     HasMany(x => x.People).KeyColumn("UserId").Inverse(); // UserId is on the Person 
    } 
} 

编辑:新增表结构。


[User] 
UserId 
... -- Other Columns 
PrimaryPersonId -- FK to PersonId in Person table 

[Person] 
PersonId 
... -- Other Columns 
UserId -- FK to UserId in User Table for user has many Persons. 
+0

我假设你指的是HasMany(x => x.People).KeyColumn(“UserId”)。Inverse(); ?这是一群人(与主要无关)。我会更新我的答案与表结构,所以它是有道理的。 – Phill 2010-12-21 03:30:38

+0

谢谢,但我的意思是,没有这样的事情作为引用(x => x.User).Inverse();也没有引用(x => x.User).Column(“UserId”)。Inverse(); – Rap 2010-12-21 17:11:21

+0

嘿,我假定了模式映射,你能用你的模式更新你的问题吗? – Phill 2010-12-21 20:06:51

相关问题