2013-08-04 107 views
0

我用我的域类与EF5 System.ComponentModel.DataAnnotations和框架4.5Dataannotation Foreignkey属性名称vs列名?

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

然而example here使用列名作为外键,而不是导航属性名称。 这两种做法有什么区别吗?

[

回答

3

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

根据您是否将EF 5与.NET 4.0或.NET 4.5一起使用,其清晰或不清晰。

在.NET 4.0(其中ForeignKeyAttribute类是EntityFramework.dll组件的一部分)(悬停例如属性时),你会在智能感知中看到的说明说(由我强调):

表示在关系中用作外键的属性。该 注释可放在外键属性并指定 相关的导航属性的名称,或将其放在导航 财产,并指定相关的外键的名称。

在.NET 4.5(其中ForeignKeyAttribute此类已移至到框架的System.ComponentModel.DataAnnotations.dll总成)的说明中已成为一个同义反复的信息:

表示作为一个外键的属性关系。

1

您发布展示了如何使用EF代码首先创建管理器的导航属性并将其映射到类型人的例子 -

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理解它是一个外键,并且一切都很开心。

+0

有趣。然而,我所有的主键被称为Id,所以我需要告诉EF FK应该映射到哪个表。我很困惑,显然有两种方式,尽管我只能让他们中的一个工作。 –

+0

那么,如果它仍处于开发早期,并且您可以使用默认约定,那么我将使用'SalesLeadId'而不是SalesLead_Id,您将使您的生活更轻松。 –

+0

为什么SalesLeadId比SalesLead_Id更好? –