Настройте основной ключ или набор совместимых свойств внешнего ключа для этого отношения - PullRequest
2 голосов
/ 05 марта 2019

Попытка создать 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();
            }
...