使用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字段。
这是唯一的区别吗? 我认为我们不能一次查询多个表,即查询相关数据吗?
我什么时候应该选择使用这两个选项?
答案 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
内置的应用程序)