【问题标题】:How to change the state of an entity if the same entity is contained in different collections of an entity如果同一实体包含在实体的不同集合中,如何更改实体的状态
【发布时间】:2017-09-26 13:04:40
【问题描述】:

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

public class Document
{
    public int Id { get; set; }    

    public virtual ICollection<User> UsersOne { get; set; }

    public virtual ICollection<User> UsersTwo { get; set; }
}

实体 Document 与实体 User 有两个多对多关系:

public class User
{
    public int Id { get; set; }

    [Required]
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }
}

在我的请求中,我发送以下 Json:

{
    "UsersOne": [{"Id": 1},{"Id": 2},{"Id": 3}],
    "UsersTwo": [{"Id": 1},{"Id": 2},{"Id": 3}],
    "Id": 0 
}

问题是我已经在上下文中拥有用户,当我在上下文_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”类型的实体具有相同的主键值。确保显式设置的主键值是唯一的。

我也尝试将两个集合合二为一,并更改它们的状态,但上下文仍然有用户添加状态。

在将文档添加到上下文之前,我还尝试将用户状态更改为分离,但是在_context.SaveChangesAsync(); 上,由于属性电子邮件和密码,引发了“System.Data.Entity.Validation.DbEntityValidationException”类型的异常是用户所必需的。

【问题讨论】:

  • 我也有同样的问题!

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


【解决方案1】:

你有两个选择:

  1. 如果正在创建用户实体并将其添加到两个不同的列表中,您必须先创建并保存用户实体本身,然后返回并将新创建的用户添加到两个列表中。

  2. 当您反序列化 JSON 时,您必须创建一个用户实体并将相同的实例添加到两个集合中。否则,EF 将认为它们是具有相同 PK 的两个不同用户实体并抛出该异常。如果您向两者添加相同的实例,EF 应该会识别它是同一个用户并正确保存。

最后,如果您仅使用 ID 保存此用户实体,您将在电子邮件和密码上收到所需的错误,因为那里有 [Required] 注释。

【讨论】:

  • 您好 Daniel,感谢您的回答,我们根据她找到了解决方案。首先我们在上下文中找到用户,然后清除用户和文档的关系,然后我们将找到的用户设置到文档中。
猜你喜欢
  • 2019-12-05
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多