【问题标题】:Entity Framework CodeFirst - To decorate or not to decorate [closed]实体框架代码优先 - 装饰或不装饰[关闭]
【发布时间】:2013-12-31 03:43:33
【问题描述】:

在做 CodeFirst 方法时,有两种方法来声明键和相关表。

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

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

这是一个偏好问题还是使用一个而不是另一个有意义?新项目应该使用什么?

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

【问题讨论】:

  • 两者各有优势。这些属性的优势在于与 EF 无关的代码也可以使用反射来利用它们。模型构建器的优势在于可以表达更多方面,如果您需要任何没有可用属性的东西,您仍然可以将各种配置位放在一起。哪个最好,没有更多细节,因此主要是意见和品味的问题。您的问题中是否有任何部分无法获得基于意见的答案,您能否将问题集中在这一点上?

标签: c# .net entity-framework


【解决方案1】:

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

数据注释会污染您的模型类,而 fluent API 允许您将该逻辑分离到 DbContext 中,如果您愿意,甚至可以分离到单独的 EntityTypeConfiguration 类中。

我个人更喜欢保持我的 POCO 干净,并将这些细节排除在我的模型之外,因此倾向于选择使用 fluent API。

【讨论】:

    【解决方案2】:

    如前所述,当您使用 Fluent API(第二种方法)时,您将拥有更多功能。对于主键,在哪里定义它并不重要。你应该按照你个人的喜好去做。对于像钥匙这样简单的事情,我个人更喜欢在 POCO 上定义它,因为它让我的DbContext 更聪明。如果我有 100 个 POCO,那么我只有 100 行代码来定义密钥。但另一方面,您可以将所有定义集中在一个地方。

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

    【讨论】:

      【解决方案3】:

      设置一个主键,没关系。(如果你不想设置composite primary键)但是做更复杂的工作和配置所有设置,你应该使用Fluent API。例如,您不能使用属性将 cascade Delete 设置为 False。您不能在many-to-many 与属性的关系中配置第三个表名。此外,您不能更改与属性的关系的默认功能。您可以使用Fluent API 来完成所有这些以及更多操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 2017-07-05
        相关资源
        最近更新 更多