我有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'。”
思想?
答案 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();