C# 实体框架代码优先-装饰还是不装饰

C# 实体框架代码优先-装饰还是不装饰,c#,.net,entity-framework,C#,.net,Entity Framework,在使用CodeFirst方法时,有两种方法可以声明键和相关表 public class Person { [Key] public int Id { get; set; } } 或 这是一个偏好的问题,还是使用一个比另一个更有意义?在新项目中应该使用什么 更新:我将有大约8个实体,每个实体大约有1-4个关系,我希望允许级联删除。要设置主键,这无关紧要。ofc。如果您不想设置密钥,但想执行更复杂的作业并配置所有设置,则应使用。例如,不能使用属性将cascade Delete设置为

在使用CodeFirst方法时,有两种方法可以声明键和相关表

public class Person
{
    [Key]
    public int Id { get; set; }
}

这是一个偏好的问题,还是使用一个比另一个更有意义?在新项目中应该使用什么


更新:我将有大约8个实体,每个实体大约有1-4个关系,我希望允许级联删除。

要设置主键,这无关紧要。ofc。如果您不想设置密钥,但想执行更复杂的作业并配置所有设置,则应使用。例如,不能使用属性将cascade Delete设置为False。不能在具有属性的多对多关系中配置第三个表名。也不能更改具有属性的关系的默认功能。要完成所有这些以及更多功能,您可以使用。

第一种方法的数据注释只有第二种方法fluent API功能的一个子集

数据注释可能会污染模型类,而fluentapi允许您在DbContext中分离该逻辑,或者如果愿意,甚至可以将其分离到单独的类中


我个人更喜欢保持我的POCO干净,不让这些细节出现在我的模型中,因此倾向于选择使用fluent API。

如前所述,当您使用fluent API第二种方法时,您有更多的功能。对于主键,在何处定义它并不重要。你应该做你个人喜欢做的事。对于像密钥这样简单的东西,我个人更喜欢在POCO上定义它,因为它使我的DbContext更加智能。如果我有100个POCO,那么我只有100行代码来定义密钥。但另一方面,你把所有的定义都放在一个地方


但我想看看的是。在您的情况下,不必定义键。按照惯例,名为Id或PersonId的属性(int、long或Guid)会自动设置为主键。

它们都有各自的优点。这些属性的优点是EF不可知代码也可以使用它们,使用反射。模型构建器的优点是可以表达更多方面,如果您需要任何没有可用属性的东西,您仍然可以将各种配置位放在一起。哪一个最好,没有更多细节,因此主要是意见和品味的问题。你的问题中是否有任何部分不能得到基于意见的答案,你能把你的问题集中在这一点上吗
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Person>().HasKey(e => e.Id);
}