如何更新嵌套模型

时间:2019-03-28 08:05:16

标签: c# entity-framework entity-framework-core

让我们说我有一个非常简单的类,代表一个订单。此订单将具有其自身的类状态(待处理,进行中,已发送)。通过ID链接。

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

    // ...other properties

    public int StatusId { get; set; }

    public StatusModel Status { get; set; }
}

因此,当我更新StatusId时,我(显然)也想更新状态。但是,在实体框架中,做到这一点的最佳方法是什么。我可以想到两种方式,但是我不确定哪个更“正确”或为什么。

  • 更改StatusId时,还要加载匹配的StatusModel并将其分配给作业(从数据库中再读取一次)。
  • 将订单保存到数据库中(使用新的StatusId)之后,重新加载整个订单(也是另一次读取,但有可能要读取的数据很多)。

尽管以上两种方法都有效,但它似乎并不适合实体框架的“智能”。更改相关外键(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 :(得分:0)

    private int _statusId;

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

封装可能会帮助您。

答案 1 :(得分:0)

关于状态,我创建了一个枚举状态的枚举,并在模型中使用该枚举创建了一个属性,如下所示:

 public enum Status :int
    {
        Pending,
        Inprogress,
        Sent

    }

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

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

这在性能方面会更好(因为将没有连接)。 此外,然后我们可以编写一些代码来创建具有所有DbEnums的表(如果需要在数据库上表示此表)。