【问题标题】:What is the point of creating foreign key properties when using Entity Framework Code First?使用 Entity Framework Code First 时创建外键属性有什么意义?
【发布时间】:2012-03-04 10:11:41
【问题描述】:

在查看此站点上的问题和答案并阅读一些 Google 排名最高的 Code First 开发教程时,我经常看到以下模式...

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://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

http://www.codeproject.com/Articles/327945/Architecture-Guide-ASP-NET-MVC3-Entity-Framework-C

问题: 那么在 Code First C# 对象上具有外键属性有什么意义呢?在上面的示例中,您可以从 Product 类中省略 CategoryID,一切都会正常工作。外键Category_ID 仍将在数据库中创建。

我唯一能想到的是人们可能希望能够使用可空类型而不是流畅的 API 来指定关系是否是可选的,但我认为同时拥有 Category 和 @ 确实会混淆事物987654329@财产。

所以在我四处走动并删除所有外键属性之前,这里有什么我遗漏的吗?这样做有什么意义?

谢谢!

【问题讨论】:

  • 我认为将其设为Guid? 会有所不同。一些 DataAnnotations 可能适用。
  • 是的,我在我的问题中提到过......但使用 fluent API 无法完成的任何事情?当你不需要时拥有两个本质上重复的属性似乎很邪恶。

标签: c# entity-framework ef-code-first


【解决方案1】:

是的,我认为不需要外键属性,它们在某种程度上是对象世界中的关系工件。您可以在没有 FK 属性的情况下完全定义关系。在 Fluent API 中,您可以定义关系是可选的还是必需的,并且您可以指定数据库表的外键列名。这种关系称为独立关联

我的理解是,外键关联 - 与模型类中公开的外键属性的关系 - 仅存在于使实体框架中的关系在某些情况下更容易和更舒适。例如:

假设您有一个用于创建或编辑产品的 Web 视图,并且该视图包含一个用于选择类别并将其分配给产品的组合框。要在呈现视图时填充组合框,您将加载例如数据库中所有类别的 IDName

回发页面后,您将收到产品的属性和所选类别的ID。如果您的 Product 中没有外键属性 CategoryID,则必须以这种方式创建关系:

var category = new Category { ID = IDFromComboBox };
context.Categories.Attach(category);
product.Category = category;

使用 FK 属性,您只需要一行:

product.CategoryID = IDFromComboBox;

Entity Framework 版本 1 (.NET 3.5) 中不存在外键属性,并且已在 EF 版本 4 (.NET 4) 中引入以更好地支持上述场景。

可以找到关于外键关联的批判性观点,并且在 Ladislav 的博客中很好地讨论了两种关联之间的区别:

http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/

【讨论】:

  • 感谢您的深入回复和博客参考。也许我在您的示例中遗漏了一些东西......如果您使用数据库中的类别填充组合框并且使用所选类别 ID 回发表单,您不会尝试从数据库中提取类别 (var category = db.Single(x =&gt; x.ID == id);) ,执行验证,然后通过简单地转到 product.Category = category? 来分配类别
  • @JohntheRevelator:是的,这是另一种选择。但这需要额外的数据库往返。如果您有 ID,则不需要此往返,这就是 Attach 的用途。验证是一个好点,您的意思是验证具有发布 ID 的类别是否存在,对吗?您仍然可以使用 if (db.Categories.Any(x =&gt; x.ID == id)) ... 来执行此操作,它只返回 bool,并且比返回完整类别更便宜。
猜你喜欢
  • 2017-05-25
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多