【问题标题】:How to mark identity column properly with Entity Framework 6.1?如何使用 Entity Framework 6.1 正确标记标识列?
【发布时间】:2015-11-26 20:02:28
【问题描述】:

我看过很多关于如何将字段标记为标识列的帖子和答案。其中许多已经过时并且针对的是旧版本的实体框架。

一些资源告诉我在字段上使用属性:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }

其他资源告诉我将此代码添加到OnModelCreating方法:

modelBuilder.Entity<User>().Property(u => u.ID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);

我应该使用哪一个?第一,第二,两者都无所谓,还是别的什么?

【问题讨论】:

  • 任你选择。我将两者混合使用:属性用于类似这样的简单事物,modelBuilder 用于属性未涵盖的更复杂场景。它们都同样有效,您会看到在幕后(EF“约定”),属性用于告诉modelBuilder 做什么。
  • @Amy 谢谢。我想我会采用属性方法,因为它会产生更清晰的代码。您能否发表您的评论作为答案,以便我接受?
  • 这个属性是主键吗?
  • @CodeNotFound 是的。我也有Key 属性(我认为我不需要它,因为属性名称是ID
  • 您不需要这些配置,因为 ID 是主键和数字类型。我的回答如下。

标签: .net sql-server entity-framework entity-framework-6 .net-4.6


【解决方案1】:

只要主键属性的类型是数字或 GUID,Code First 就会按照惯例自动将键配置为标识列。

这意味着您无需在代码中进行任何配置即可将属性显式设置为标识列,因为 Code First 已经为此使用了约定。您设置的数据注释属性或 fluent API 配置是无用的。

仅当您想禁用标识时,您才可以在数字或 GUID 类型的主键上使用这些配置。

【讨论】:

  • 不知道。很高兴看到我不需要这些。
  • 添加到@CodeNotFound,实体框架代码优先可以使用约定优于配置。约定是将您的身份列命名为 Id、ID、MyClassNameId 或 MyClassNameID,Entity Framework 将为您完成工作,或者您使用 Configuration 明确指定您希望 EF Code First 对您的模型执行的操作,例如添加 DataAnnotations并使用 Fluent API 配置。您可以在同一模型上混合和匹配约定和配置。
【解决方案2】:

这是为那些在这个问题上浪费了两个多小时的人准备的。

我犯了一个错误,将一列标记为 KEY,后来我意识到这不是关键,而只是一列。

我的模型有依赖关系,所以我不能只是删除 KEY 属性并让它保持不变。在生成相应的迁移和设置后,默认的 Id 列永远不会在 SQL Server 上作为标识列:标识为真。

相反,我必须从上下文中删除 Dbset,删除对它的所有引用以及其他实体中的引用。并生成一个删除表的迁移,然后修复模型..确保它没问题。然后生成做得好的模型,插入所有依赖项。

首先这是我的错误。所以除了我自己,我没有什么可以责备的。

希望没有人再次遇到这种情况,但如果真的发生了,这就是我所做的。

【讨论】:

    【解决方案3】:

    (对于搜索并到达这里的人) 还有一点需要注意的是,EF Core 将尝试在插入查询的 ID 字段中使用一个值,即使它被标记为 DatabaseGeneratedOption.Identity。 我在我的 Id 字段中有 -1 试图添加一条新记录,并期望 EF 忽略我的值,但它将它传递给插入查询并失败,并出现“无法为标识列插入显式值” 仅当您将 Id 字段设置为零时才有效。

    【讨论】:

      【解决方案4】:

      任你选择。我将两者混合使用:属性用于类似这样的简单事物,modelBuilder 用于属性未涵盖的更复杂场景。它们都同样有效,您会看到在幕后(EF“约定”),属性用于告诉modelBuilder做什么。

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2010-09-12
        • 2019-09-07
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        • 1970-01-01
        相关资源
        最近更新 更多