C# 如果同一实体包含在实体的不同集合中,如何更改实体的状态

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

我正在尝试插入一个名为Document的新实体:

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;