C# EF代码优先-具有子实体的序列号
在Asp.NETWeb应用程序中使用EF6.X 考虑下面的父子关系。 订单实体可以有一个或多个订单行。 在OrderLine实体中,我希望有一个序列列 如上图所示,每个订单的顺序应从1开始。C# EF代码优先-具有子实体的序列号,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,在Asp.NETWeb应用程序中使用EF6.X 考虑下面的父子关系。 订单实体可以有一个或多个订单行。 在OrderLine实体中,我希望有一个序列列 如上图所示,每个订单的顺序应从1开始。 我如何通过EF实现这一点?需要一个简单的解决方案来解决此问题。不可能自动执行此操作。订单行的数据模型将需要一个属性SequenceNo。更高级别的抽象必须确保每当添加“订单行”时,都会填充正确的SequenceNo public class Order { // primary Key p
我如何通过EF实现这一点?需要一个简单的解决方案来解决此问题。不可能自动执行此操作。订单行的数据模型将需要一个属性
SequenceNo
。更高级别的抽象必须确保每当添加“订单行”时,都会填充正确的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;}
...
}
您不能为每个订单行使用一个计数器吗?@Ephraim您能提供一个简单的代码示例吗?请解释这种关系。。。示例表做了一个垃圾工作,显示了什么与什么相关。这就是我想要的。谢谢!
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;
}
}