我有一个普通的1-n关系中的2个表:Invoice
和WorkOrder
。 Invoice
可以有多个WorkOrders
,而WorkOrder
可以有一个Invoice
。我知道,这是惊天动地的。
这是我的Invoice
:
public class Invoice
{
public Guid Id { get; set; }
// some fields....
public virtual IList<WorkOrder> WorkOrders { get; set; }
}
这是我的WorkOrder
:
public class WorkOrder
{
public Guid Id { get; set; }
public Guid InvoiceId { get; set; }
public virtual Invoice Invoice { get; set; }
}
当我去查询发票时,我收到此错误:
列名称'Invoice_Id2'无效。
当我查看SSMS中的WorkOrder
表时,我发现不是一列,而是3列引用Invoice
:InvoiceId
,Invoice_Id
和Invoice_Id1
。
显然,EF在弄清楚我想要它做什么时出现了一些错误。
我确实找到了Invoice_Id2
的FK,我删除了它,但我仍然遇到了问题。
答案 0 :(得分:0)
根据我的经验,当EF试图根据错误的导航属性匹配关系时,会发生这种类型的错误。例如,如果你有:
public int InvoiceId { get; set; }
public virtual Invoice Invice { get; set; }
注意上面的拼写错误。 EF期望在数据库中有一个名为Invice_Id
的列。我会检查你的相关实体是否有错误的导航属性。
答案 1 :(得分:0)
所以事实证明我犯了一些上面没有详述的错误(bc我并不认为它们是相关的,自然而然)。也就是说,我的Invoice
实体中有一堆getter方法返回IList<WorkOrder>
,EF错误地将这些方法作为导航属性。
据我所知,一旦您创建了一个以这种方式提升的表格,您最好放弃违规表格,添加[NotMapped]
属性麻烦的属性,并重新创建表。希望您已经在这些表中没有重要的生产数据。我很幸运。
我真的很惊讶这些获取者会被ORM选为导航属性,因此请注意将来。也许不那么聪明,将来做直接的方法会更聪明。