首页 > 解决方案 > 错误:声明的导航属性类型与结果不兼容

问题描述

这个错误对我来说毫无意义。我已经阅读了这里和其他地方的各种答案 - 我没有点击任何内容。

导航属性“Invoice.LineItems”的声明类型与指定导航的结果不兼容

我有两张桌子:InvoicesLineItems。在最简单的形式中,它们看起来像:

发票
ID

LineItems
InvoiceID
名称
数量

和实体:

Public Class Invoice
    <Key>
    Public Property InvoiceID As Int64

    Public Overridable Property LineItems As List(Of LineItem) = New List(Of LineItem)
End Class


Public Class LineItem
    <Key>
    Public Property InvoiceID As Int64

    Public Property Name As String

    Public Property QTY As Int32 = 0
End Class

尝试使用关联的 LineItem 获取 Invoices 时,出现上述错误。

Using database As PosDatabase = New PosDatabase
    Dim invoices As List(Of Invoice) = database.Invoices _
        .Include("LineItems") _
        .ToList()
End Using

这是 EF 6.2.0

解决问题的任何帮助将不胜感激。

标签: entity-framework

解决方案


该异常是由于模型映射不当引起的。

的 FKInvoiceID属性LineItem被标记为 PK,从而有效地使关系 1 变为 0..1,即将LineItems集合导航属性表示的关系的预期多重性从Many更改为One

我想这只是一个映射错误,实际的 PKLineItem应该是不同的——要么是自己的身份列,要么是LineItemID复合 PK (InvoiceID, Name)

所以只需映射正确的PK(带有数据注释或流利的API),LineItem问题就会得到解决。在我的测试中,我做到了

modelBuilder.Entity<LineItem>()
    .HasKey(e => new { e.InvoiceID, e.Name });

推荐阅读