让我们说我有一个非常简单的类,代表一个订单。此订单将具有其自身的类状态(待处理,进行中,已发送)。通过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`
}
答案 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的表(如果需要在数据库上表示此表)。