如何在EF数据注释中指定外部表键?

时间:2015-10-08 19:24:32

标签: c# entity-framework sqlite

我尝试使用实体框架的数据注释来配置表之间的关系。我找到了following example

public class Student
{
    public Student() { }

    public int StudentId { get; set; }
    public string StudentName { get; set; }

     public int StdandardRefId { get; set; }

    [ForeignKey("StandardRefId")]
    public virtual Standard Standard { get; set; }
}

public class Standard
{
    public Standard()
    {
        StudentsList = new List<Student>();
    }
    public int StandardId { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

现在,ForeignKey属性通知,StandardRefId是foregin密钥。我猜,EF从属性类型(Standard)中推断出目标表。但是,我没有看到,如何定义外键引用的列。我试过了:

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

[ForeignKey("CompanyId")]
[InverseProperty("Id")]
public CompanyDAL Company { get; set; }

然而,我得到的只是以下例外:

  

未处理的类型&#39; System.InvalidOperationException&#39;发生在EntityFramework.dll

中      

其他信息:财产&#39; Id&#39;无法配置为导航属性。该属性必须是有效的实体类型,并且该属性应具有非抽象的getter和setter。对于集合属性,类型必须实现ICollection,其中T是有效的实体类型。

我如何明确地说CompanyId指向Id表的Company属性?

1 个答案:

答案 0 :(得分:2)

外键将始终引用主键。当您为公司创建导航属性时,该FK将引用公司的PK。

  

实体框架依赖于具有用于跟踪实体的密钥值的每个实体。代码首先依赖的约定之一是它如何暗示哪个属性是每个代码第一类中的键。该惯例是查找名为“Id”的属性或组合类名称和“Id”的属性,例如“BlogId”。该属性将映射到数据库中的主键列。

Source

这意味着除非您为公司指定了不同的PK,否则&#34; Id&#34; property(和column)将是该实体的PK。

注意:对于您找到的示例,Standard使用PK的第二个约定,即Id