实体框架 - 不存在的列上的列错误无效

时间:2015-08-28 01:59:16

标签: sql-server entity-framework

我有一个普通的1-n关系中的2个表:InvoiceWorkOrderInvoice可以有多个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列引用InvoiceInvoiceIdInvoice_IdInvoice_Id1

显然,EF在弄清楚我想要它做什么时出现了一些错误。

我确实找到了Invoice_Id2的FK,我删除了它,但我仍然遇到了问题。

2 个答案:

答案 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选为导航属性,因此请注意将来。也许不那么聪明,将来做直接的方法会更聪明。