Dataannotation Foreignkey属性名称与列名称?

时间:2013-08-04 23:06:22

标签: ef-code-first entity-framework-5

我在使用EF5和framework 4.5的域类中使用System.ComponentModel.DataAnnotations

public class SalesOrderLine : LoggedEntity
    {
       [ForeignKey("SalesLine")]
       [Required]
       public int SalesLine_Id { get; set; }
       public SalesLine SalesLine { get; set; }
  }

但是example here使用列名作为外键,而不是导航属性名称。 这两种方式之间有什么区别吗?

[

2 个答案:

答案 0 :(得分:3)

没有区别。这两种用法都是一样的。

根据您使用的是带有.NET 4.0的.NET 5还是.NET 4.5,这是明确的还是不明确的。

在.NET 4.0中(ForeignKeyAttribute类是EntityFramework.dll程序集的一部分),您将在Intellisense中看到的描述(例如,当悬停在属性上时)(我强调) :

  

表示在关系中用作外键的属性。该   注释可以放在外键属性上并指定   关联的导航属性名称,或放置在导航上   property 并指定关联的外键名称。

在.NET 4.5中(ForeignKeyAttribute类已移入框架的System.ComponentModel.DataAnnotations.dll程序集中),描述变得像重言式一样具有信息性:

  

表示在关系中用作外键的属性。

答案 1 :(得分:1)

您发布的示例显示了如何使用EF代码优先创建Manager的导航属性并将其映射到类型Person -

public class Project
{
    public int ProjectId { get; set; }
    public string Name { get; set; }
    public int ManagerId { get; set; }
    // The following will use ManagerId as the foreign key and map it to PersonId, or w/e the key field is for person
    [ForeignKey("ManagerId")]
    public Person Manager { get; set; }
}

您的代码使用SalesLine_Id建立SalesLine的外键关系,SalesLine的类型为SalesLine。

public class SalesOrderLine : LoggedEntity { 
    [ForeignKey("SalesLine")] 
    [Column("SalesLine_Id")]  
    [Required] 
    public int SalesLine_Id { get; set; } 
    public SalesLine SalesLine { get; set; } 
}

重要的是要理解的是,除非您使用奇怪的命名约定,否则您可能不必使用所有注释来装饰您的类,因为EF会自动按照您希望的方式映射所有内容这些名字相当一致 -

public class SalesOrderLine {
    public int SalesOrderLineId { get; set; }
    public string Description { get; set; }
    public int SalesLineId { get; set; } 
    public virtual SalesLine SalesLine { get; set; } 
}

public class SalesLine {
    public int SalesLineId { get; set; }
    public string Description { get; set; }

    public ICollection<SalesOrderLine> SalesOrderLines { get; set; }
}
作为一个例子,

工作得很好。如果你需要使关系变得更复杂,你可能需要开始考虑使用Fluent API进行配置,但是代码可以在没有数据注释的情况下正常工作。由于SalesLineId不可为空,因此需要,EF知道它是外键,一切都很满意。