在执行CodeFirst方法时,有两种方法可以声明密钥和相关表。
public class Person
{
[Key]
public int Id { get; set; }
}
OR
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Person>().HasKey(e => e.Id);
}
这是一个偏好的问题还是使用一个而不是另一个?在新项目中应该使用什么?
更新:我将有大约8个实体,每个实体有大约1-4个关系,我想允许级联删除。
答案 0 :(得分:4)
第一种方法(数据注释)只有第二种方法(流畅的API)的一部分功能。
数据注释会污染您的模型类,而流畅的API允许您在DbContext
中将该逻辑分开,或者如果您愿意,甚至可以分成单独的EntityTypeConfiguration类。
我个人更喜欢保持我的POCO清洁并将这些细节留在我的模型中,因此倾向于选择使用流畅的API。
答案 1 :(得分:2)
如上所述,当您使用Fluent API(第二种方法)时,您有更多功能。对于主键,无论您在何处定义它都无关紧要。你应该按照自己的意愿去做。对于像键我喜欢在POCO上定义它这样简单的东西,因为它使我的DbContext
更聪明。如果我有100个POCO,那么我只有100行代码来定义密钥。但另一方面,您可以在一个地方完成所有定义。
但我要看的是convention over configuration。在您的情况下,您不必定义密钥。按照惯例,名为Id
或PersonId
的{{1}},int
或long
属性会自动设置为主键。
答案 2 :(得分:1)
要设置主键,无关紧要。(如果您不想设置composite primary密钥),但要执行更复杂的作业并配置所有设置,您应该使用{{3 }}。例如,您无法使用属性将cascade Delete
设置为False。您无法在many-to-many
与属性的关系中配置第三个表名。此外,您无法更改与属性的关系的默认功能。要完成所有这些操作,您可以使用Fluent API。