ユーザーからUserDetailsテーブルへの1対1のマッピングを設定しようとしています。データベースに次のテーブルがあるとします。
Users:
- UserID (PK, Identity)
- UserName
- Password
UsersDetails:
- UserID (PK, FK)
- FirstName
- LastName
次のpocoクラスを作成しました。
public class User {
public virtual int UserID { get; set; }
public virtual string UserName { get; set; }
public virtual string Password { get; set; }
public virtual UserDetails Details { get; set; }
}
public class UserDetails {
public virtual int UserID { get; set; }
public virtual User User { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public UserDetails() {
}
public UserDetails(User user) {
User = user;
}
}
流暢にマッピングされているもの(xmlマッピングは非常に似ていることに注意してください。知っているのがxmlマッピングだけの場合でも、ガイダンスをいただければ幸いです):
public class UserMap : ClassMap<User> {
public UserMap() {
Table("Users");
Id(x => x.UserID);
Map(x => x.UserName);
Map(x => x.Password);
HasOne(x => x.Details)
.Constrained()
.Cascade.All();
}
}
public class UserDetailsMap : ClassMap<UserDetails> {
public UserDetailsMap() {
Table("UsersDetails");
Id(x => x.UserID)
.GeneratedBy.Foreign("User");
HasOne(x => x.User)
.Constrained();
Map(x => x.FirstName);
Map(x => x.LastName);
}
}
すべてが正しく表示されますが、私が言う場合:
var user = new User() { UserName = "Test", Password = "Test" };
user.Details = new UserDetails(user) { FirstName = "Test", LastName = "Test" };
session.Save(user);
エラーが発生します:
"NHibernate.Id.IdentifierGenerationException:null idが生成されました:UserDetails。"
誰かが私が間違ったことを見せてくれたら本当にありがたいです。ありがとう
編集: JamieIdeの提案の礼儀。ユーザーマッピングを次のように変更しました。
public class UserMap : ClassMap<User> {
public UserMap() {
Table("Users");
Id(x => x.UserID);
Map(x => x.UserName);
Map(x => x.Password);
References(x => x.Details, "UserID")
.Class<UserDetails>()
.Unique();
}
}
しかし、ユーザーを挿入すると、次のエラーが発生します。
System.ArgumentOutOfRangeException:インデックスが範囲外でした。負ではなく、コレクションのサイズ未満である必要があります。」
参照にCascade.All()を追加すると、生成されたnullIDについて取得していた元のエラーが表示されます。