一意の制約を持つ多対 1 を使用して 1 対 1 の関係をマッピングすると、「AccountDetail に対して生成された null id」という例外が発生しました。
これが私のSQLテーブルです:
Account(Id, Name)
AccountDetail(AccountId, Remark)
AccountId は主キーと外部キーの両方です。
これが私のドメイン モデル (アカウントとアカウントの詳細) です。
public class Account
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual AccountDetail Detail { get; set; }
public Account()
{
Detail = new AccountDetail
{
Account = this
};
}
}
public class AccountDetail
{
public virtual int AccountId { get; set; }
public virtual Account Account { get; set; }
public virtual string Remark { get; set; }
}
マッピング (コードによる NHibenrate 3.3 マッピング):
class AccountMap : ClassMapping<Account>
{
public AccountMap()
{
Table(typeof(Account).Name);
Id(c => c.Id, m => m.Generator(Generators.Native));
Property(c => c.Name);
OneToOne(c => c.Detail, m =>
{
m.Constrained(true);
m.Cascade(Cascade.All);
m.PropertyReference(typeof(AccountDetail).GetPropertyOrFieldMatchingName("Account"));
});
}
}
class AccountDetailMap : ClassMapping<AccountDetail>
{
public AccountDetailMap()
{
Table(typeof(AccountDetail).Name);
Id(c => c.AccountId, m =>
{
m.Column("AccountId");
m.Generator(Generators.Foreign<AccountDetail>(x => x.Account));
});
Property(c => c.Remark);
ManyToOne(c => c.Account, m =>
{
m.Column("AccountId");
m.Unique(true);
});
}
}
ところで: AccountDetail の AccountId プロパティを削除できますか? つまり、Account プロパティのみを使用します。AccountDetail クラスで AccountId と Account プロパティの両方を使用することは、オブジェクト指向ではないように見えます。
ありがとう!