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

Entity framework 6 在实体框架6中将新的子记录添加到父表,entity-framework-6,referential-integrity,Entity Framework 6,Referential Integrity,我有三张桌子: 帐户:Id、名称 用户:Id、帐户Id、名称 UserDetail:Id,UserId,电话 实体: public partial class Account { public Account() { this.Users = new HashSet<User>(); } public int Id{get;set;} public string Name{get;set;} public virtua

我有三张桌子:

帐户:Id、名称

用户:Id、帐户Id、名称

UserDetail:Id,UserId,电话

实体:

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;}
}
我得到以下错误: “引用约束中的依赖属性映射到存储生成的列。列:“Id”。

想法?

试试这个

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();

ReferentialConstraint中的依赖属性映射到存储生成的列。列:“Id”

我更详细地研究了这个错误,发现了这篇文章:

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

解决方案是删除autoincrement属性,或者在User to UserDetail或UserDetail to User上添加不同的FK

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

为什么?


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

如果提供Account、User和UserDetail的类定义,您会得到更多帮助。@EtihwSirhc我现在做了我应该提到这是DB first EF模型,对不起!我无法对模型进行更改。帐户表没有指向用户表的外键。用户表的AccountId映射到Account表的Id。EF模型生成器创建了映射。对,这就是我不要求的结果。更新了我的答案。这个想法确实出现在我的脑海中,但我想知道我是否可以不使用AccountController中的另一个UserService类就离开(如果你知道我的意思的话)。另外,我使用的是工作单元模式,如果我这样做的话,它会被破坏。假设你的代码中有一个工作单元,我看不出有什么问题。您可以使用(var transaction=context.Database.BeginTransaction()){try{transaction.Commit();}catch(Exception){transaction.Rollback();}}}将其包装到事务
中,发现问题!用户和用户详细信息之间的关系映射是问题所在。UserDetail.Id是一个自动增量标识列,UserDetail.Id已映射到User.Id。保存用户时,请单击UserDetail。
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();