使用ID与对象的EF外键引用

时间:2019-02-20 13:07:56

标签: c# entity-framework-core

使用ID与对象的外键引用之间有什么区别。

例如: 使用ID的FK关系

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public int CategoryId { get; set; }
}

vs 使用对象的FK关系

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public Category Category { get; set; }
}

我从数据库中注意到,通过使用Id属性,该列实际上变成了非null字段。

这是唯一的区别吗? 我认为我们不能一次查询多个表,即查询相关数据吗?

我什么时候应该选择使用这两个选项?

2 个答案:

答案 0 :(得分:1)

在第一个示例中,您没有添加关系,只是添加了一个名为CategoryId的整数属性。 在您的第二个示例中,Entity Framework将创建一个名为“ Category_ID”的整数列,但是您将无法在模型中看到此属性,因此我想显式地将其添加为self并将其与导航属性。

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }


    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public Category Category{get;set;}
}

这样,您还可以控制CategoryId的数据类型,因此可以将其设置为可选(可空)

public int? CategoryId { get; set; }

*不需要外键数据注释,除非您拥有的属性或导航属性名称不遵循外键属性名称的命名约定(感谢Bardr)

这意味着您正在与产品和类别建立一对多关系(1- *),因此在Category类中,您将为产品添加集合导航属性

class Category
{
  public int Id{ get; set;}
  public string Name{ get; set; }
  ...
  public ICollection<Product> Products{get; set;}
}

答案 1 :(得分:0)

基本上,这取决于您的用例和您选择的loading related数据类型。是否在两端(Id和对象)使用Id或对象引用还是full关系,都取决于整体应用程序体系结构。如果您愿意在任何地方使用full或对象引用,那么您(可能)会一团糟,并且您将不知道是否应该使用其存储库来查询某些实体,或者它是否可以将它们包括到其他查询中。我强烈建议您阅读this这本书,尤其是第19章(汇总)和第21章(存储库)。在那里,您对我的意思有更深入的解释。 (这不仅适用于DDD way内置的应用程序)