0

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

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

但是,此处的示例使用列名称作为外键,而不是导航属性名称。这两种方式有什么区别吗?

[

4

2 回答 2

3

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

这取决于您是使用 .NET 4.0 还是使用 .NET 4.5 的 EF 5,哪个清楚或不清楚。

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

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

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

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

于 2013-08-04T23:39:58.903 回答
1

您发布的示例显示了如何使用 EF Code-first 创建 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 类型。

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

于 2013-08-04T23:14:18.263 回答