[英]EF Code First - Having Sequence Number for child entities
Using EF 6.X with Asp.Net web application. 将EF 6.X与Asp.Net Web应用程序一起使用。
Consider below parent child relationship. 考虑以下亲子关系。 A Order Entity can have one or more OrderLines.
订单实体可以具有一个或多个订单行。 In the OrderLine entity I would like to have a sequence column.
在OrderLine实体中,我想要一个序列列。
As shown in the above image, the sequence should be start from 1 for each Orders. 如上图所示,每个订单的顺序应从1开始。 How can I achieve this through EF?
如何通过EF实现这一目标? Expecting a simple solution to solve this.
期待一个简单的解决方案来解决这个问题。
It is not possible to do this automatically. 无法自动执行此操作。 Your data model of the order line will need a property
SequenceNo
. 您的订单行数据模型将需要属性
SequenceNo
。 Higher levels of abstraction Data Access Layer? 更高级别的抽象数据访问层? will have to make sure that whenever an 'OrderLine' is added the correct
SequenceNo
is filled. 必须确保无论何时添加“ 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;}
...
}
Higher Level Of abstraction 更高的抽象水平
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.