我在使用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使用列名作为外键,而不是导航属性名称。 这两种方式之间有什么区别吗?
[
答案 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知道它是外键,一切都很满意。