我遇到此错误:
UpdateException:无法确定相关操作的有效顺序。可能由于外键约束,模型要求或商店生成的值而存在依赖关系。
当我在数据库中创建记录时。
数据库(无法更改)具有以下结构:
Users
- UserID (PK, FK, int not null) (no identity spec)
Persons
- PersonID (PK, Identity spec)
这是我的代码:
var user = new User();
user.Username = emailAddresses.First();
user.Password = encryptedPassword;
user.Salt = salt;
user.Active = true;
user.EditedBy = 1;
var role = new User_Roles();
role.UserId = user.UserId;
role.EditedBy = 1;
role.RoleId = 11;
var person = new Person();
user.UserId = person.PersonId;
person.FirstName = firstname;
person.LastName = lastname;
person.MiddleName = middleName;
user.Persons.Add(person);
context.Persons.Add(person);
context.Users.Add(user);
context.User_Roles.Add(role);
context.SaveChanges();
我正在使用EF 6.2,但不确定如何使它正常工作。我使用EDMX方法从数据库中创建模型。
值得注意的是,使用EF Core可以正常工作,但是我不能在项目的特定区域使用EF Core。
有什么想法在这里做什么?如何获得没有错误的“用户和个人”保存?我怀疑该用户是一个自引用表。
对于人物模型,我添加了以下属性:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int PersonId { get; set; }
对于用户模型,我添加了以下内容:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
public int UserId { get; set; }
但无济于事。
答案 0 :(得分:1)
问题很可能是:
var person = new Person(); user.UserId = person.PersonId;
人是一个身份规范,在您致电SaveChanges之前,EF这里没有ID。
解决此问题的最佳方法是建立实体关系,以便EF在关联ID上将User和Person之间的一对一关系关联起来。我不建议将“ UserID”映射到“ PersonID”,因为从数据查询角度来看这很容易混淆。只需给用户一个PersonId。
对于映射,您可以使用EntityTypeConfiguration或将其与modelBuilder映射。
例如
done()
然后,当您插入用户/人员时:
data
用户角色将遵循用户和角色之间的多对多映射。根据架构的不同,可以在有或没有链接实体(UserRole)的情况下完成此操作,尽管通常使用链接实体会更简单,所以我建议您阅读如何映射它们。对于诸如变更跟踪(CreatedAt / CreatedBy等)之类的事情,您将需要链接实体,因为较少实体的多对多联接仅支持仅具有2x FK的表,而没有其他列。