Допустим, у меня есть действительно простой класс, представляющий заказ. Этот заказ будет иметь статус (в ожидании, в процессе, отправлен), который является собственным классом. Он связан через идентификатор.
public class OrderModel
{
public int OrderId { get; set; }
// ...other properties
public int StatusId { get; set; }
public StatusModel Status { get; set; }
}
Поэтому, когда я обновляю StatusId
, я (очевидно) также хочу обновить статус. Но что является лучшим способом сделать это, в Entity Framework. Я могу придумать два пути, но я не уверен, какой из них более «правильный» или почему.
- При изменении
StatusId
также загрузите соответствующий StatusModel
и назначьте его заданию (создаст еще одно чтение из базы данных).
- После сохранения заказа в базе данных (с новым
StatusId
) перезагрузите весь заказ (также еще одно чтение, но потенциально гораздо больше данных для чтения).
Хотя оба вышеперечисленных варианта работают, на самом деле они не соответствуют "умности" Entity Framework. Нет ли способа автоматически обновить свойство public StatusModel Status
при изменении соответствующего внешнего ключа (StatusId
), то есть что-то вроде этого:
public void ChangeStatus(OrderModel order, int newStatusId)
{
// Get the db context
var ctx = GetMyDbContext();
// Update the order from the input. Since the order from the input,
// will be used afterwards, it is important that it stays in sync
// with the database
order.StatusId = newStatusId;
// Find the matching order in the database/DbContext and update it
var orderToUpdate = ctx.Orders.First(o => o.OrderId = order.OrderId)
ctx.Entry(orderToUpdate ).CurrentValues.SetValues(job);
// Save the changes made to the database/DbContext
await ctx.SaveChanges();
// Do something clever to update the `Status` of the `order`
}