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