Как обновить вложенные модели - PullRequest
0 голосов
/ 28 марта 2019

Допустим, у меня есть действительно простой класс, представляющий заказ. Этот заказ будет иметь статус (в ожидании, в процессе, отправлен), который является собственным классом. Он связан через идентификатор.

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`
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Когда дело доходит до статусов, я создаю перечисление, которое представляет состояние и создаю свойство в модели с таким перечислением, как показано ниже:

 public enum Status :int
    {
        Pending,
        Inprogress,
        Sent

    }

    public class OrderModel
    {
        public int OrderId { get; set; }

        // ...other properties
        public Status OrderStatus { get; set; }
    }

это будет лучше с точки зрения производительности (так какне будет никаких объединений).Кроме того, тогда мы могли бы написать некоторый код для создания таблиц со всеми DbEnums (если вам нужно представить это в базе данных).

0 голосов
/ 28 марта 2019
    private int _statusId;

    public int StatusId { get => _statusId; set {
            _statusId = value;
            //call StatusModel update function
        }
    }

Инкапсуляция может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...