【问题标题】:Error: the declared type of navigation property is not compatible with the result错误:声明的导航属性类型与结果不兼容
【发布时间】:2019-02-23 19:51:30
【问题描述】:

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

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

我有两张桌子:InvoicesLineItems。 它们最简单的形式如下:

发票
发票编号

订单项
发票ID
名称
数量

和实体:

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

当尝试获取带有关联 LineItems 的发票时,我收到上述错误。

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

这是 EF 6.2.0

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

【问题讨论】:

  • 这里有错字吗:(...) As List(Of LineItem) = New List(Of LineItem) 或这里:Public Class LineItems
  • @Jimi:我在问题中更正了这一点。谢谢。手动输入问题,然后偷偷输入。实际代码中没有拼写错误。

标签: entity-framework


【解决方案1】:

异常是由于模型映射不正确造成的。

LineItem 的 FK InvoiceID 属性被标记为 PK,从而有效地使关系从 1 变为 0..1,即将由 LineItems 集合导航属性表示的关系的预期多重性从 @ 987654324@转One

我猜这只是一个映射错误,LineItem 的实际 PK 应该是不同的 - 要么像 LineItemID 这样的自己的身份列,要么在 (InvoiceID, Name) 上的复合 PK。

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

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

【讨论】:

  • 啊。我懂了。还有其他解决方案吗?我问是因为 LineItems 表没有正确的 PK,只有 InvoiceID FK。我正在编写与另一家公司的 POS 集成的软件 - 所以修改 POS 数据库是不可能的。我想,由于在我的特定场景中我只需要读取数据,我可以将 Invoice.LinesItems 标记为 NotMapped,然后单独查询 LineItems,并手动将它们与 Invoices 关联。不过,这会降低使用 ORM 的价值。
  • 不客气 :) 不幸的是,没有其他“开箱即用”的 EF 方式。 EF需要PK。如果您只是在阅读,它不需要是真实的,但必须是某种东西 - 您可以将所有字段标记为复合 PK,并希望没有重复的组合。如果这不起作用,那么是的,手动读取 LineItems 是唯一的选择。
猜你喜欢
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2019-01-15
相关资源
最近更新 更多