在SaveChanges上更新一对多关系失败

时间:2019-05-26 03:28:54

标签: c# entity-framework-core

我有两个实体。首先是“订单”

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();

但这不是一种有效的方法! –

2 个答案:

答案 0 :(得分:0)

每当您按以下方式加载Order时:

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

它不会与Items的{​​{1}}一起加载,因此不会被跟踪和更新!

因此,您必须按照以下方式加载OrderItems,然后修改Order集合:

Item

答案 1 :(得分:0)

你需要做的是调用Context.Update(将你的对象作为参数传递在这里),见下文

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.Update(order);
  _context.SaveChanges();

这在您创建的 DbContext 的同一个实例中非常完美。让它在我身边完美地工作