为什么Entity Framework会查找错误的外键列?

时间:2017-11-25 02:55:08

标签: entity-framework

我已经看到有关相关主题的各种问题,看起来他们会解决我的问题,但我尝试的任何事情似乎都没有帮助。

我有一个现有数据库的EF(6.1.3)模型,它一直运行良好。我刚刚在表中添加了一个附加列,表示一个新的关系。也许相关的是,这种关系是两个表之间的第二个关系 - 原来的Location现在由ActualDirectSite加入,它们都与UniformLocation表相关联。 / p>

当我添加两个新属性ActualDirectSiteIDActualDirectSite时,我的SELECT查询开始失败并显示错误“无效列名'Location_ID'”。确实,该列不存在,但我不明白为什么EF正在寻找它 - 它之前很高兴,但有些事情让它认为列名应该是不同的。失败的名字让我觉得原来的位置不知何故不再有效。

这是有问题的实体:

public partial class Uniform
{
    public int ID { get; set; }

    [Column("LocationID")]
    public int? LocationID { get; set; }

    [ForeignKey("LocationID")]
    public virtual Location Location { get; set; }

    public int? ActualDirectSiteID { get; set; }

    [ForeignKey("ActualDirectSiteID")]
    public virtual Location ActualDirectSite { get; set; }
}

我的(缩短的)表格def:

CREATE TABLE [dbo].[Uniforms](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [LocationID] [int] NULL,
    [ActualDirectSiteID] [int] NULL)

依赖惯例导致对列名称做出错误假设的明显解决方案是明确指定它们,因此我尝试使用Column注释,并确保ID和导航属性知道每个其他人使用ForeignKey,但没有骰子。有什么想法吗?

编辑:添加了缺少的LocationID字段(已存在于完整代码中)

EDIT2:要清楚,在我向实体添加ActualDirectSiteID之前,它一切正常,没有需要注释。我刚看了一下生成的SQL,看起来Location_ID引用对应ActualDirectSite属性:

//[Extent1] is "Uniform"
... , [Extent1].[LocationID] AS [LocationID], [Extent1].[ActualDirectSiteID] AS [ActualDirectSiteID], [Extent1].[Location_ID] AS [Location_ID], //...[Extent4] begins

EDIT3:我没有包含任何Location实体,这里是:

[Table("Location")]
public partial class Location
{
    public int ID { get; set; }

    public virtual ICollection<Uniform> Uniforms { get; set; }
}

1 个答案:

答案 0 :(得分:1)

如评论中所述:对于同一个表的多个导航属性,EF会对哪个导航属性引用哪个反向导航属性以及忽略这些属性的FK映射感到困惑。我在前一段时间遇到的类似问题可以找到in this SO question.

解决此问题的方法(我知道)只有两种:

  • 使用[NotMapped]或.Ignore()或

  • 忽略至少除一个导航属性外的所有属性
  • 向此表中的(至少)一个导航属性添加反向导航属性,并相应地调整映射。

实际上,这种行为闻起来就像EF端的一个错误(从数据库的角度来看,我没有看到问题),但解决方法很简单。