EF 代码优先 - 具有子实体的序列号
Posted
技术标签:
【中文标题】EF 代码优先 - 具有子实体的序列号【英文标题】:EF Code First - Having Sequence Number for child entities 【发布时间】:2017-10-16 09:28:30 【问题描述】:将 EF 6.X 与 Asp.Net Web 应用程序一起使用。
考虑下面的父子关系。 一个订单实体可以有一个或多个订单行。 在 OrderLine 实体中,我想要一个序列列。
如上图所示,每个订单的顺序应从 1 开始。 如何通过 EF 实现这一目标?期待一个简单的解决方案来解决这个问题。
【问题讨论】:
你不能只为每个 OrderLine 使用一个计数器吗? @Ephraim 能否提供一个简单的代码示例? 请解释一下关系...示例表在显示什么与什么相关方面做得很糟糕。 【参考方案1】:无法自动执行此操作。您的订单行数据模型将需要一个属性SequenceNo
。更高级别的抽象Data Access Layer? 必须确保无论何时添加“OrderLine”,都会填充正确的SequenceNo
。
public class Order
// primary Key
public int Id get; set;
// an Order has a collection of OrderLines:
public virtual ICollection<OrderLine> OrderLines get; set;
...
public class OrderLine
public int Id get; set; // primary key
// foreign key to owning Order
public int OrderId get; set;
public virtual Order Order get; set;
public int OrderLineNo get; set;
public int SequenceNo get; set;
...
public MyDbContrext : DbContext
public DbSet<Order> Orders get; set;
public DbSet<OrderLine> OrderLines get; set;
...
更高层次的抽象
public int IntroduceOrder(...)
using (MyDbContext dbContext = ...)
Order orderToAdd = new Order()
...
var addedOrder = dbContext.Orders.Add(orderToAdd);
dbContext.SaveChanges();
return addedOrder.Id;
public OrderLine AddOrderLine(int orderId, ...)
using (MyDbContext dbContext = ...)
// get the sequenceNo from the orderline of the order with orderId
// with the highest sequenceNo
// = first element when ordered descending
int highestSeqenceNo = dbContext.OrderLines
.Where(orderLine => orderLine.OrderId == orderId)
.Select(orderLine => orderLine.SequenceNo)
.OrderByDescending(sequenceNo => sequenceNo)
.FirstOrDefault();
// if there were no order lines yet, highestSequenceNo has value 0
const int sequenceNoFirstOrderLine = 1;
// or whatever value you want as sequenceNo for the first OrderLine
int nextSequenceNo = (highestSequenceNo == 0) ?
sequenceNoFirstOrderLine :
highestSequenceNo + 1;
OrderLine orderLineToAdd = new OrderLine()
...
SequenceNo = nextSequenceNo,
;
var addedOrderLine = dbContext.Orders.Add(orderLineToAdd);
dbContext.SaveChanges();
return addedOrderLine;
【讨论】:
这就是我想要的。谢谢!以上是关于EF 代码优先 - 具有子实体的序列号的主要内容,如果未能解决你的问题,请参考以下文章