Fluent NHibernate:如何在两个方向上进行一对多引用?

Rap*_*Rap 1 c# nhibernate-mapping fluent-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
}
Run Code Online (Sandbox Code Playgroud)

如果没有循环引用,类映射如何查找此内容?

Joy*_* P. 5

尝试这个:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是假设您的 ID 是自动编号,并且当您更新用户时,您还希望您的 PrimaryPerson 也随之更新。如果不是这种情况,请将 Cascade.All() 更改为 Cascade.None() 。请确保在执行此操作时手动更新 PrimaryPerson,否则如果不这样做,您将在 SubmitChanges() 上收到“对象引用未保存的瞬态实例”。