Maciej Los
Внимательно посмотрите на свои модели, особенно на подчеркнутые линии:
Модель Заголовка Продаж
public int SalesOrderNo { get; set; } //1
public int SalesYear { get; set; }
public int BranchCode { get; set; }
public int SalesType { get; set; } //2
public DateTime SalesDate { get; set; }
public int CustomerID { get; set; }
public Customer Customers { get; set; }
public ICollection<SalesFooter> SalesFooters { get; set; } //3
Модель нижнего колонтитула продажpublic int SalesOrderNo { get; set; } //1
public int SalesLineNo { get; set; }
public int SalesType { get; set; } //2
public int BranchCode { get; set; }
public string ItemCode { get; set; }
public decimal Quantity { get; set; }
public decimal UnitPrice { get; set; }
public decimal Total { get; set; }
public Items Itemes { get; set; }
public SalesHeader SaleHeaders { get; set; } //3
1.
SalesOrder
является общей частью обеих моделей.
2.
SalesType
, аналогично
SalesOrder
, является общей частью обеих моделей.
3. Коллекции
SalesHeader
и
SalesFooter
они связаны друг с другом.
Это звучит как плохой дизайн!
В вашем случае вам нужно создать отношение "один ко многим", где
SalesOrder SalesOrderDetails
SalesOrderNo (PK) 1 -> ∞ SalesOrderNo (FK)
*
PK
- первичный ключ
*
FK
- внешний ключ
Давайте проиллюстрируем это на реальных данных:
SalesOrders (SalesHeader)
SalesOrderNO 1
SalesYear 2019
SalesDate 2019-01-17
BranchCode 1
SalesTypeNo 1
CustomerNo 2509
SalesOrderDetails (SalesFooter)
SalesOrderNo SalesLineNo ItemCode Quantity Price Total
1 1 12929 5 10 50
1 2 17918 4 5 20
Итак, перепишите свои модели, чтобы отразить вышеприведенные данные. Заметить что
SalesOrderNo
поле, которое вы можете скрыть в поле зрения.
Пожалуйста, прочтите подробнее об этом
Реляционная база данных[
^]
[РЕДАКТИРОВАТЬ]
Пример:
void Main()
{
List<SalesOrder> orders = new List<SalesOrder>()
{
new SalesOrder(){SalesOrderNo = 1, SalesDate = new DateTime(2019,1,17), BranchCode = 1, SalesTypeNo = 1, CustomerNo = 2509},
new SalesOrder(){SalesOrderNo = 2, SalesDate = new DateTime(2019,1,17), BranchCode = 2, SalesTypeNo = 2, CustomerNo = 3945}
};
List<SalesOrderDetails> details = new List<SalesOrderDetails>()
{
new SalesOrderDetails(){SalesDetailNo = 1, SalesOrderNo = 1, SalesLineNo = 1, ItemCode = 12929, Quantity = 5, Price = 10, Total = 50},
new SalesOrderDetails(){SalesDetailNo = 2, SalesOrderNo = 1, SalesLineNo = 2, ItemCode = 17918, Quantity = 4, Price = 5, Total = 20},
new SalesOrderDetails(){SalesDetailNo = 3, SalesOrderNo = 1, SalesLineNo = 3, ItemCode = 13546, Quantity = 5, Price = 6, Total = 30},
new SalesOrderDetails(){SalesDetailNo = 4, SalesOrderNo = 1, SalesLineNo = 4, ItemCode = 11001, Quantity = 100, Price = 7, Total = 700},
new SalesOrderDetails(){SalesDetailNo = 5, SalesOrderNo = 2, SalesLineNo = 1, ItemCode = 12828, Quantity = 20, Price = 8, Total = 160},
new SalesOrderDetails(){SalesDetailNo = 6, SalesOrderNo = 2, SalesLineNo = 2, ItemCode = 15467, Quantity = 5, Price = 12, Total = 60},
new SalesOrderDetails(){SalesDetailNo = 7, SalesOrderNo = 2, SalesLineNo = 3, ItemCode = 18741, Quantity = 3, Price = 30, Total = 90},
new SalesOrderDetails(){SalesDetailNo = 8, SalesOrderNo = 2, SalesLineNo = 4, ItemCode = 13698, Quantity = 2, Price = 100, Total = 200},
new SalesOrderDetails(){SalesDetailNo = 9, SalesOrderNo = 2, SalesLineNo = 5, ItemCode = 12587, Quantity = 8, Price = 8, Total = 64},
};
foreach(SalesOrder SalesHeader in orders)
{
Console.WriteLine("\n{0}{1}{2}", new string('=', 3), " Order ", new string('=', 3));
Console.WriteLine("SalesOrderNo: {0}\nSalesDate: {1}\nSalesYear: {2}\nBranchCode: {3}\nSalesTypeNo: {4}\nCustomerNo: {5}",
SalesHeader.SalesOrderNo, SalesHeader.SalesDate, SalesHeader.SalesYear, SalesHeader.BranchCode, SalesHeader.SalesTypeNo, SalesHeader.CustomerNo);
Console.WriteLine("{0}{1}{2}", new string('=', 3), " Order details ", new string('=', 3));
List<SalesOrderDetails> items = details.Where(x=>x.SalesOrderNo==SalesHeader.SalesOrderNo).ToList();
foreach(SalesOrderDetails SalesFooter in items)
{
Console.WriteLine("SalesLineNo: {0}\tItemCode: {1}\tQuantity: {2}\tPrice: {3}\tTotal: {4}",
SalesFooter.SalesLineNo, SalesFooter.ItemCode, SalesFooter.Quantity, SalesFooter.Price, SalesFooter.Total);
}
}
}
// Define other methods and classes here
public class SalesOrder //SalesHeader
{
public int SalesOrderNo {get; set;}
public DateTime SalesDate {get; set;}
public int SalesYear {get=>SalesDate.Year;}
public int BranchCode {get; set;}
public int SalesTypeNo {get; set;}
public int CustomerNo {get; set;}
}
public class SalesOrderDetails // SalesFooter
{
public int SalesDetailNo {get; set;}
public int SalesOrderNo {get; set;}
public int SalesLineNo {get; set;}
public int ItemCode {get; set;}
public int Quantity {get; set;}
public decimal Price {get; set;}
public decimal Total {get; set;}
}
Результат:
=== Order ===
SalesOrderNo: 1
SalesDate: 2019-01-17 00:00:00
SalesYear: 2019
BranchCode: 1
SalesTypeNo: 1
CustomerNo: 2509
=== Order details ===
SalesLineNo: 1 ItemCode: 12929 Quantity: 5 Price: 10 Total: 50
SalesLineNo: 2 ItemCode: 17918 Quantity: 4 Price: 5 Total: 20
SalesLineNo: 3 ItemCode: 13546 Quantity: 5 Price: 6 Total: 30
SalesLineNo: 4 ItemCode: 11001 Quantity: 100 Price: 7 Total: 700
=== Order ===
SalesOrderNo: 2
SalesDate: 2019-01-17 00:00:00
SalesYear: 2019
BranchCode: 2
SalesTypeNo: 2
CustomerNo: 3945
=== Order details ===
SalesLineNo: 1 ItemCode: 12828 Quantity: 20 Price: 8 Total: 160
SalesLineNo: 2 ItemCode: 15467 Quantity: 5 Price: 12 Total: 60
SalesLineNo: 3 ItemCode: 18741 Quantity: 3 Price: 30 Total: 90
SalesLineNo: 4 ItemCode: 13698 Quantity: 2 Price: 100 Total: 200
SalesLineNo: 5 ItemCode: 12587 Quantity: 8 Price: 8 Total: 64
Удачи вам!