保存时有效的订购问题

时间:2018-09-03 07:26:35

标签: c# entity-framework entity-framework-6

我遇到此错误:

  

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

但无济于事。

1 个答案:

答案 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的表,而没有其他列。

相关问题