2014-10-08 99 views
0

我有3个表:在实体框架添加新的子记录的父表6

帐户: ID,姓名

用户:标识,ACCOUNTID,名称

UserDetail : Id,UserId,Phone

Entitites:

public partial class Account 
{ 
    public Account() 
    { 
     this.Users = new HashSet<User>(); 
    } 

    public int Id{get;set;} 
    public string Name{get;set;} 
    public virtual ICollection<User> Users{get;set;} 
} 

public partial class UserDetail 
{ 
    public int Id{get;set;} 
    public string Phone {get;set;} 
    public virual User User {get;set;} 
} 

public partial class User 
{ 
    public User() 
    { 
     this.Accounts = new HashSet<Account>(); 
    } 

    public int Id{get;set;} 
    public virtual ICollection<Account> Accounts {get;set;} 
    public virtual UserDetail UserDetail{get;set;} 
} 

正如您所看到的,Account to User是一对多关系,所以我的Account实体拥有Users DbSet。而用户与UserDetail是一对一的关系。

我目前正试图插入一个用户和userdetail记录到现有的帐户。所以,我的代码如下所示:

var newUserDetail = new UserDetail(); 
newUserDetail.Phone = 014109842; 

var newUser = new User(); 
newUser.Name = "John Smith"; 
newUser.UserDetail = newUserDetail; 

var currentAccount = _dbContext.Accounts.First(a => a.Id == 100); 
currentAccount.User.Add(newUser); 
_dbContext.SaveChanges(); 

,我发现了以下错误: “在ReferentialConstraint从属属性映射到一个存储生成的列柱:‘身份证’。”

想法?

+0

如果为帐户,用户和UserDetail提供您的班级定义,您将获得更多帮助。 – 2014-10-09 00:04:19

+0

@EtihwSirhc我现在做了 – amythn04 2014-10-09 07:37:23

回答

1

ReferentialConstraint中的依赖属性映射到商店生成的列。专栏:“ID”

我更详细地研究了这个错误,跨越此帖一:A dependent property in a ReferentialConstraint is mapped to a store-generated column

基本上,它说,UserDetail.Id(取决于物业)具有参照约束,也是一个存储生成列即自动增量。

解决方案是删除autoincrement属性或添加一个不同的FK用户UserDetail或UserDetail用户。

吸取的经验教训: 1.绝对有名称的类/表的标识列。例如,如果可以,请使用表名作为前缀命名您的身份(PK)列。所以在我的问题中,我应该将所有Id列重新命名为AccountId,UserId和UserDetailId。

为什么?

EF已经给我一个明显的线索来看看UserDetailId上的映射的innerexception。没有这个,我一直想知道哪个映射是有问题的映射。

0

试试这个。

var newUserDetail = new UserDetail(); 
newUserDetail.Phone = 014109842; 
_dbContext.UserDetail.Add(newUserDetail); 

var newUser = new User(); 
newUser.Name = "John Smith"; 
_dbContext.User.Add(newUser); 

_dbContext.saveChanges(); // save changes so the db can generate ID's 

newUser.UserDetail = newUserDetail; 

var currentAccount = _dbContext.Accounts.First(a => a.Id == 100); 
currentAccount.User.Add(newUser); 
_dbContext.SaveChanges(); 
+0

我应该提到这是一个DB首先是EF模型,对不起!我无法对模型进行更改。帐户表不具有用户表的外键。用户表具有映射到帐户表的Id的AccountId。 EF模型生成器创建了映射。 – amythn04 2014-10-09 10:22:49

+0

对,这就是我不问的问题。更新了我的答案。 – 2014-10-09 12:07:09

+0

这个想法确实让我想起了,但是我想知道如果我能够在帐户控制器中使用另一个UserService类(如果你知道我的意思)是否可以离开。另外,如果我这样做,我使用的工作模式将会中断。 – amythn04 2014-10-09 15:06:44