2017-05-17 21 views
0

使用EF 6.X和Asp.Net Web應用程序。EF代碼優先 - 具有子實體的序列號

請考慮下面的父母子女關係。 訂單實體可以有一個或多個訂單行。 在OrderLine實體中,我想要有一個序列列。

enter image description here

作爲上述圖像中示出,該序列應當從1開始對每個訂單。 如何通過EF實現這一目標?期待一個簡單的解決方案來解決這個問題。

+0

不能你只需要使用每個訂單行計數器? –

+1

@Ephraim你能提供一個簡單的代碼示例嗎? – Rahul

+0

請解釋關係...示例表做一個垃圾工作,展示與什麼有關的東西。 – Seabizkit

回答

1

不可能自動執行此操作。訂單行的數據模型需要屬性SequenceNo。更高級別的抽象Data Access Layer?必須確保每當添加'訂單行'時,填充正確的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; 
    } 
} 
+0

這就是我想要的。謝謝! – Rahul