Свободное владение NHibernate: Как получить ссылку «один ко многим» в обоих направлениях? - PullRequest
1 голос
/ 21 декабря 2010

У нас пользователей в нашей системе и человек . Есть много людей для каждого пользователя. Но когда пользователь входит в систему, нам нужно просмотреть его основную запись Person, чтобы указать его имя, адрес, телефон и т. Д.

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
}

Как карта классов выглядит без круговой ссылки?

Ответы [ 2 ]

4 голосов
/ 23 декабря 2010

Попробуйте это:

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();
  }
}

Предполагается, что ваши идентификаторы являются автоматическими и что при обновлении пользователя вы также хотите, чтобы ваш PrimaryPerson обновлялся вместе с ним. Измените Cascade.All () на Cascade.None (), если это не так. Просто убедитесь, что когда вы это сделаете, вы обновите PrimaryPerson вручную или вы получите «объект ссылается на несохраненный временный экземпляр» на SubmitChanges (), если вы этого не сделаете.

0 голосов
/ 21 декабря 2010

Исходя из моего комментария к вашему вопросу, я думаю, что отображение будет выглядеть примерно так:

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. 
...