[英]What is the point of creating foreign key properties when using Entity Framework Code First?
在查看本网站上的问题和答案并阅读一些关于Code First开发的Google排名前列的教程时,我经常会看到以下模式......
public class Category
{
public Category()
{
Products = new Collection<Product>();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
public Guid ID { get; set; }
public string Name { get; set; }
public DateTime DateAdded { get; set; }
public Guid CategoryID { get; set; } // Seemingly redundant property
public virtual Category Category { get; set; }
}
在搜索Code First教程时,会出现以下两个使用相同模式的页面:
http://www.codeproject.com/Articles/327945/Architecture-Guide-ASP-NET-MVC3-Entity-Framework-C
问题:那么在Code First C#对象上拥有外键属性有什么意义呢? 在上面的示例中,您可以省略Product
类中的CategoryID
,一切都可以正常工作。 仍将在数据库中创建外键Category_ID
。
我唯一能想到的是人们可能希望能够使用可空类型而不是流畅的API来指定关系是否是可选的,但我认为它确实混淆了具有Category
和CategoryID
属性的东西。
所以在我去除所有外键属性之前,有什么我在这里缺少的吗? 这样做有什么意义?
谢谢!
是的,我认为不需要外键属性,它们在某种程度上是对象世界中的关系神器。 您可以完全定义关系而无需FK属性。 在Fluent API中,您可以定义关系是可选的还是必需的,并且可以指定数据库表的外键列名。 这种关系然后被称为独立协会 。
我的理解是, 外键关联 - 与模型类中公开的外键属性的关系 - 仅存在于使实体框架中的关系在某些情况下更容易和更舒适。 例如:
假设您有一个用于创建或编辑产品的Web视图,该视图包含一个组合框,用于选择类别并将其分配给产品。 要在呈现视图时填充组合框,您将加载例如数据库中所有类别的ID
和Name
。
页面回发后,您将收到产品的属性和所选类别的ID
。 如果你没有一个外键属性CategoryID
在你的Product
,你就必须建立的关系是这样的:
var category = new Category { ID = IDFromComboBox };
context.Categories.Attach(category);
product.Category = category;
使用FK属性,您只需要一行:
product.CategoryID = IDFromComboBox;
实体框架版本1(.NET 3.5)中不存在外键属性,并且已在EF版本4(.NET 4)中引入,以更好地支持上述方案。
可以找到关于外键关联的批判性观点,在Ladislav的博客中非常好地讨论了这两种类型的关联之间的区别:
http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.