首页 > 解决方案 > SaveChanges 更新一对多关系失败

问题描述

我有两个实体。第一个是“订单”

public class Order : EntityBase
{

    public Guid ClientKey { get; set; }
    public Guid EmployeeKey { get; set; }
    public DateTime CreatedOn { get; set; }
    public DeliveryType DeliveryType { get; set; }
    public Address Address { get; set; }
    public Client Client { get; set; }
    public Employee Employee { get; set; }

    public bool SoftDeleted { get; set; }
    public virtual ICollection<JourneyOrder> JourneyOrder { get; set; }
    **public virtual ICollection<Item> Items
    { get; set; }**
    public virtual ICollection<ItemToBeFactored> ItemToBeFactored
    { get; set; }


    public Order() : base()
    {

        Items = new HashSet<Item>();
        ItemToBeFactored = new HashSet<ItemToBeFactored>();
        JourneyOrder = new HashSet<JourneyOrder>();
        CreatedOn = DateTime.Now;

    }
}

第二个是:“项目”:

public class Item : EntityBase
{

    public string Name { get; set; }
    public double Height { get; set; }
    public double width { get; set; }
    public string Color { get; set; }
    public Guid OrderKey { get; set; }

    **public Order CustomerOrder { get; set; }**
}

我正在尝试在此代码中更新 Order 实体中的导航属性:

var order = _context.Orders.Where(x => x.Key.Equals(new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"))).Include(x => x.Items).
            First();

  order.Items = new List<Item> 
  {
        new Item {  Color = "Green", width = 20d }
  };

  _context.SaveChanges();

我收到了这个重复的错误:

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:'数据库操作预计会影响 1 行,但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除

更新是在“一对一”属性上进行的,但在一对多导航属性上是疯狂的!

更新:

我可以以虚拟的方式使用更新!首先:我从订单中清除了物品,然后

_context.Items.add( new Item { OrderKey = order.Key, Color = "Blue", width = 240d }) 
then _context.SaveChanges();

但这不是一种有效的方法!——</p>

标签: c#entity-framework-core

解决方案


每当您加载Order如下内容时:

var order = _context.Orders.Find(new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"));

它没有与它一起加载ItemsOrder因此它没有被跟踪和更新!

所以你必须加载Items如下Order,然后修改Item集合:

var order = _context.Orders.Where(o => o.Id == new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"))
                           .Include(o => o.Items).FirstOrDefault(); // I assumed your `Order` primary key name is `Id`

  order.Items = new List<Item> 
  {
        new Item {  Color = "Green", width = 20d }
  };

  _context.SaveChanges();

推荐阅读