将新的子记录添加到实体框架6中的父表

时间:2014-10-08 18:18:24

标签: entity-framework-6 referential-integrity

我有3张桌子:

帐户:ID,姓名

用户: ID,AccountId,姓名

UserDetail: ID,UserId,手机

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;}
}

如您所见,帐户到用户是一对多关系,因此我的帐户实体具有用户DbSet。 User to 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中的依赖属性映射到商店生成的列。列:'Id'。”

思想?

2 个答案:

答案 0 :(得分:1)

ReferentialConstraint中的依赖属性映射到存储生成的列。专栏:&#34; Id&#34;

我更详细地研究了这个错误,并发现了这篇文章:A dependent property in a ReferentialConstraint is mapped to a store-generated column

基本上,它说UserDetail.Id(它是依赖属性)有一个引用约束,也是一个存储生成的列,即自动增量。

解决方案是删除自动增量属性或在User to UserDetail或UserDetail上向User添加不同的FK。

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

为什么?

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

答案 1 :(得分: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();