EF Code First - Последовательный номер для дочерних объектов


1 принят

Это невозможно сделать автоматически. Для вашей модели данных строки заказа потребуется свойство SequenceNo. Более высокий уровень абстракции Уровень доступа к данным? нужно будет убедиться, что всякий раз, когда добавляется «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;
    }
}
C #, asp.net, сущность-рамки,

c#,asp.net,entity-framework,

0

Ответов: 1


1 принят

Это невозможно сделать автоматически. Для вашей модели данных строки заказа потребуется свойство SequenceNo. Более высокий уровень абстракции Уровень доступа к данным? нужно будет убедиться, что всякий раз, когда добавляется «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;
    }
}
C #, asp.net, сущность-рамки,