地图一对一关系不允许插入 [英] Map One-To-One Relationship Doesn't Allow Inserting

查看:135
本文介绍了地图一对一关系不允许插入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从我的用户到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆