私たちはユーザー、当社システム、人です。各ユーザーには多くの人がいます。しかし、ユーザーがログオンしたときに、私たちは住所、彼の名前を記入するために彼の主要人物レコードを検索する必要があり、携帯電話など流暢NHibernate:両方向で1対多の参照を持つ方法?
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
}
にどのようにクラスマップは、循環参照することなく、このために見えますか?
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
}
}
編集:追加されたテーブルの構造
このように、ユーザーはPersonと1対多の関係を持ち、UserにはPrimary Personがあります。 – Phill
それは正しいです、フィル。 1人のユーザーには多くの人がいます。しかし、その人のうちの1人だけがPrimaryPersonです。 – Rap
おそらく私は何か不足していますが、 'UserMap'の' PersonMap'と 'References(x => x.PrimaryPerson)'に 'References(x => x.User)'を持つことができません。 Hibernateは基本的にこれらが個別の一対多の関係であることを見ています( 'User'は' ICollection SecondaryPersons'を格納していないので、双方向性はありません)。これはあなた自身が制約を実施しなければならないということです。私はこれは循環参照を持っていると思いますが...あなたのドメインクラスもそうです。 –
fostandy