实体框架代码优先 - 装饰或不装饰

时间:2013-12-29 10:41:51

标签: c# .net entity-framework

在执行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个关系,我想允许级联删除。

3 个答案:

答案 0 :(得分:4)

第一种方法(数据注释)只有第二种方法(流畅的API)的一部分功能。

数据注释会污染您的模型类,而流畅的API允许您在DbContext中将该逻辑分开,或者如果您愿意,甚至可以分成单独的EntityTypeConfiguration类。

我个人更喜欢保持我的POCO清洁并将这些细节留在我的模型中,因此倾向于选择使用流畅的API。

答案 1 :(得分:2)

如上所述,当您使用Fluent API(第二种方法)时,您有更多功能。对于主键,无论您在何处定义它都无关紧要。你应该按照自己的意愿去做。对于像键我喜欢在POCO上定义它这样简单的东西,因为它使我的DbContext更聪明。如果我有100个POCO,那么我只有100行代码来定义密钥。但另一方面,您可以在一个地方完成所有定义。

但我要看的是convention over configuration。在您的情况下,您不必定义密钥。按照惯例,名为IdPersonId的{​​{1}},intlong属性会自动设置为主键。

答案 2 :(得分:1)

要设置主键,无关紧要。(如果您不想设置composite primary密钥),但要执行更复杂的作业并配置所有设置,您应该使用{{3 }}。例如,您无法使用属性将cascade Delete设置为False。您无法在many-to-many与属性的关系中配置第三个表名。此外,您无法更改与属性的关系的默认功能。要完成所有这些操作,您可以使用Fluent API