Не удалось обновить отношения «один ко многим» в SaveChanges - PullRequest
0 голосов
/ 26 мая 2019

У меня есть две сущности. Первый - «Заказ»

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 (и) строку (и). Данные могут быть изменены или удалены, так как объекты были загружены

Обновление работает со свойством one-to-on, но не со свойством навигации one-many !!

Обновление:

Я мог бы использовать обновление пустышкой !! Во-первых: я очистил предметы от заказа, то

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

Но это не эффективный способ !! -

1 Ответ

0 голосов
/ 26 мая 2019

Всякий раз, когда вы загружаете Order следующим образом:

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

Он не загружает Items Order вместе с ним и, следовательно, не отслеживается и не обновляется!

Таким образом, вы должны загрузить 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...