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

wen*_*n32 6 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; }
}
Run Code Online (Sandbox Code Playgroud)

与使用对象的 FK 关系

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

    public Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我从数据库中注意到,通过使用 Id 属性,列基本上变成了非空字段。

这是唯一的区别吗?我想我们不能一次查询多个表iequerying相关数据?

我什么时候应该选择使用任一选项?

The*_*One 5

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

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;}
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您还可以控制 CategoryId 的数据类型,因此您可以将其设为可选(可为空)

public int? CategoryId { get; set; }
Run Code Online (Sandbox Code Playgroud)

*不需要外键数据注释,除非您的属性或导航属性名称不遵循外键属性名称(Bardr)的命名约定,为了清晰起见,明确声明它也无害

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

class Category
{
  public int Id{ get; set;}
  public string Name{ get; set; }
  ...
  public ICollection<Product> Products{get; set;}
}
Run Code Online (Sandbox Code Playgroud)