地图一对一关系不允许插入 [英] Map One-To-One Relationship Doesn't Allow Inserting
问题描述
我试图从我的用户到UserDetails表建立一个一对一的映射。说我有我的数据库中的以下表︰
用户:
- 用户标识(PK,身份)
- 用户名
- 密码
UsersDetails:
- 用户名(PK,FK)
- 名字
-
我创建了下面的poco类:
public class User {
public virtual int UserID {get;组; }
public virtual string UserName {get;组; }
public virtual string Password {get;组; }
public virtual UserDetails Details {get;组; }
}
public class UserDetails {
public virtual int UserID {get;组; }
public virtual User User {get;组; }
公共虚拟字符串名字{get;组; }
public virtual string LastName {get;组; }
$ b public UserDetails(){
}
$ b $ public UserDetails(User user){
User = user;
这些都是流利的映射(请注意xml映射是非常相似,如果你知道的是xml映射,那么我仍然会很感激你的指导):
$ b $ pre $ public class UserMap:ClassMap<使用者名称> {
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);
$ b $ p
$ b 一切正常显示,但如果我说:
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);
引用(x => x.Details,UserID)
.Class< UserDetails>()
.Unique();
$ b现在当我插入一个用户时, :
System.ArgumentOutOfRangeException:索引超出范围,必须是非负数,小于集合的大小。
如果我添加Cascade.All()到我的引用我收到原来的错误,我得到的空id生成。方案
经过进一步的研究,似乎这不适用于2.0版本。我现在可以升级到版本3.0,我相信这是现在可能的。
I'm trying to setup a one-to-one mapping from my Users to the UserDetails table. Say I have the following tables in my database:
Users:
- UserID (PK, Identity)
- UserName
- Password
UsersDetails:
- UserID (PK, FK)
- FirstName
- LastName
I have created the following poco classes:
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;
}
}
Which are fluently mapped (please note the xml mapping is very similar and if all you know is the xml mapping then I would still appreciate you guidance):
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);
}
}
Everything displays correctly but if I say:
var user = new User() { UserName = "Test", Password = "Test" };
user.Details = new UserDetails(user) { FirstName = "Test", LastName = "Test" };
session.Save(user);
I get the error:
"NHibernate.Id.IdentifierGenerationException: null id generated for: UserDetails."
I'd really appreciate it if someone could show me what I've done wrong. Thanks
Edit: Courtesy of Jamie Ide's suggestion. I have changed my User mapping to:
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();
}
}
But now when i insert a user i get the error:
"System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection."
If i add Cascade.All() on to my Reference i receive the original error i was getting about the null id generated.
After further research it appears that this won't work in version 2.0. I am now in a position to upgrade to version 3.0 where i believe this is now possible.
这篇关于地图一对一关系不允许插入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!