C# 如果同一实体包含在实体的不同集合中,如何更改实体的状态
我正在尝试插入一个名为Document的新实体:C# 如果同一实体包含在实体的不同集合中,如何更改实体的状态,c#,.net,entity-framework,entity-framework-6,C#,.net,Entity Framework,Entity Framework 6,我正在尝试插入一个名为Document的新实体: public class Document { public int Id { get; set; } public virtual ICollection<User> UsersOne { get; set; } public virtual ICollection<User> UsersTwo { get; set; } } 在我的请求中,我发送以下Json: { "Use
public class Document
{
public int Id { get; set; }
public virtual ICollection<User> UsersOne { get; set; }
public virtual ICollection<User> UsersTwo { get; set; }
}
在我的请求中,我发送以下Json:
{
"UsersOne": [{"Id": 1},{"Id": 2},{"Id": 3}],
"UsersTwo": [{"Id": 1},{"Id": 2},{"Id": 3}],
"Id": 0
}
问题是我总是在上下文中有用户,当我在上下文\u context.document.add(entity)中添加实体文档时代码>,实体在添加状态的上下文中插入用户
可能一种解决方案是将状态更改为“未更改”:
foreach (var user in entity.UsersOne)
_context.Entry(user).State = EntityState.Unchanged;
foreach (var user in entity.UsersTwo)
_context.Entry(user).State = EntityState.Unchanged;
但当我这样做时,我有以下错误
保存或接受更改失败,因为“entity.User”类型的多个实体具有相同的主键值。确保显式设置的主键值是唯一的
我还尝试将两个集合合并为一个集合,并更改它们的状态,但上下文中仍然有添加了状态的用户
在将文档添加到上下文之前,我还尝试将users状态更改为detached,但是在\u context.SaveChangesAsync()上代码>,引发类型为“System.Data.Entity.Validation.DbEntityValidationException”的异常,因为用户需要属性电子邮件和密码。您有两个选项:
如果正在创建用户实体并将其添加到两个不同的列表中,则必须先创建并保存用户实体本身,然后返回并将新创建的用户添加到两个列表中
反序列化JSON时,必须创建一个用户实体,并将同一实例添加到两个集合中。否则,EF将认为它们是具有相同PK的两个不同用户实体,并抛出该异常。如果将相同的实例添加到这两个实例中,EF应该识别出它是同一个用户并正确保存
最后,如果您仅使用Id保存此用户实体,您将在电子邮件和密码上获得所需的错误,因为您在其中有[所需]注释。我也有同样的问题!嗨,丹尼尔,谢谢你的回答,基于她,我们找到了一个解决方案。首先我们在上下文中找到用户,然后清除用户和文档之间的关系,然后将找到的用户设置为文档。
foreach (var user in entity.UsersOne)
_context.Entry(user).State = EntityState.Unchanged;
foreach (var user in entity.UsersTwo)
_context.Entry(user).State = EntityState.Unchanged;