Как настроить объект, чтобы свойство навигации можно было включать в запросы, но оно будет исключено из отслеживания изменений

#c# #entity-framework-core #.net-5

#c# #entity-framework-core #.net-5

Вопрос:

Рассмотрите возможность следования сценарию «многие ко многим»:

 public class Order
{
   public int OrderId { get; set; }
   public ICollection<OrderItem> Items { get; set; }
}
public class Product
{
   public int ProductId { get; set; }
}
public class OrderItem 
{
   public int OrderId { get; set; }
   public int ItemId { get; set; }

   public Product Product { get; set; } // I want this navigation property to be ignored when saving order
}
  

Мне нужно иметь возможность включать OrderItem.Item свойство навигации

 Order order = dbContext.Orders
  .Include(o => o.Items).ThenInclude(o => o.Item)
  .Find(id)
  

но я также хочу, чтобы оно не отслеживалось контекстом БД. Это означает, что когда я добавляю некоторый порядок.Товары:

 void AddItem(Product product) 
{
  order.Items.Add(new OrderItem 
  {
    ProductId = product.Id,
    Product = product
  }
}
  

и вызов dbContext.SaveChanges() , любые значения OrderItem.Product свойства просто игнорируются.

Ответ №1:

Вы можете использовать AsNoTracking, чтобы сообщить entity Framework, что вы будете отвечать за отслеживание запросов.

ваш запрос будет следующим:

 var order = dbContext.Orders.AsNoTracking()
.Include(o => o.Items).ThenInclude(o => o.Item)
.Find(id);
  

Если вы хотите сохранить заказ без продуктов, вам нужно отслеживать изменения только для заказов

 public async Task AddAsync(Order entity)
{
   context.Entry(entity).State = EntityState.Added;
   await _ctx.SaveChangesAsync();
}