Попытка создать Rest API с использованием Entity Framework Core и OData.У меня есть 2 модели.Один с именем InvoiceModel, а другой с именем InvoiceLinesModel
По сути, InvoiceModel - это основная информация о счете-фактуре, которая затем содержит набор строк (InvoiceLines) с элементами (НДС, скидки и т. Д.)
См. Здесь две модели:
InvoiceModel
public class InvoiceModel
{
[ForeignKey("Id")]
public Guid Id { get; set; }
[ForeignKey("Number")]
public string Number { get; set; }
[ForeignKey("Customer")]
public Guid Customer { get; set; }
public decimal SubTotal { get; set; }
public decimal VatTotal { get; set; }
public decimal Total { get; set; }
public DateTime Created { get; set; }
public DateTime Date { get; set; }
public bool IsOpen { get; set; }
public string YourReference { get; set; }
[ForeignKey(nameof(InvoiceLinesModel.Number))]
public ICollection<InvoiceLinesModel> Lines { get; set; }
}
InvoiceLinesModel
public class InvoiceLinesModel
{
[ForeignKey("Id")]
public Guid Id { get; set; }
[ForeignKey("LineNumber")]
public int LineNumber { get; set; }
public Guid Customer { get; set; }
[ForeignKey("Number")]
public string Number { get; set; }
public string ItemCode { get; set; }
public string ItemDescription { get; set; }
public decimal PriceExcl { get; set; }
public decimal PriceIncl { get; set; }
public decimal DefaultPrice { get; set; }
public decimal VatPercentage { get; set; }
public decimal Quantity { get; set; }
public decimal Discount { get; set; }
public decimal TotalDiscount { get; set; }
public string Instruction { get; set; }
//public InvoiceModel Invoice { get; set; }
}
Теперь внутри моего контроллераЯ пытаюсь получить данные из 2 процедур.Затем с помощью foreach я хочу добавить InvoiceLines в коллекцию объекта Invoice.
public IQueryable<InvoiceModel> GetInvoices()
{
IQueryable<InvoiceModel> Invoices = null;
ICollection<InvoiceLinesModel> InvoiceLines = null;
Invoices = db.Invoices.FromSql("SIP_API_MONDIA_InvoiceMain_sel");
InvoiceLines = db.InvoiceLines.FromSql("SIP_API_MONDIA_InvoiceDetail_sel").ToList();
foreach (var item in Invoices)
{
item.Lines = InvoiceLines.Where(m => m.Number == item.Number).ToList();
}
return Invoices;
Проблема заключается в том, что я получаю сообщение об ошибке в этой строке, так как я изменил результат действия на IQueryAble, этопоскольку мне нужно иметь возможность использовать функциональность $ expand OData для возврата коллекций с OData, верно?
Invoices = db.Invoices.FromSql("SIP_API_MONDIA_InvoiceMain_sel");
Ошибка:
System.InvalidOperationException: 'Отношение из«InvoiceLinesModel» - «InvoiceModel.Lines» со свойствами внешнего ключа {«Number»: string} не может быть нацелен на первичный ключ {«Id»: Guid}, поскольку он несовместим.Настройте основной ключ или набор совместимых свойств внешнего ключа для этого отношения. '
Редактировать: В нашем случае число (которое является строкой. Не спрашивайте меня, почему оно не названопо-разному) это ключ для сравнения / ссылки.
Как вы можете видеть в контроллере:
foreach (var item in Invoices)
{
item.Lines = InvoiceLines.Where(m => m.Number == item.Number).ToList();
}