我試圖設置從我的用戶到UserDetails表的一對一映射。說我有我的數據庫中下表:地圖一對一關係不允許插入
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:用於生成空ID:的UserDetails」
我真的很感激,如果有人能告訴我我做錯了什麼。謝謝
編輯:感謝Jamie Ide的建議。我已經改變了我的用戶映射到:
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()到我的參考我收到原始錯誤我得到關於生成的空id。
乾杯,但UsersDetails表中的UserID字段是對包含自動遞增ID的Users表的引用。由於它是一對一映射,因此UsersDetails表中的用戶標識也是主鍵。希望有所幫助。 – nfplee 2011-01-11 19:26:59