【问题标题】:How to configure an Identity column using Entity Framework Core?如何使用 Entity Framework Core 配置标识列?
【发布时间】:2023-04-09 08:24:01
【问题描述】:

如何在 Entity Framework Core 中创建自动增量标识列?

显然我可以使用 EF6 的 fluent API 来做到这一点。

【问题讨论】:

  • 我认为没什么特别的,Id 字段的默认工作是递增的标识列。这给您带来了问题吗?
  • 默认改为序列。 :(
  • 我自己还没有使用过 EF7,但是当我查看 examples online 时,每个模型都只有一个 int Id 字段作为主键。
  • 按照 Rowan Miller 的说法,“在 EF7 中将列配置为身份仍然很容易,我们只是在考虑将默认设置为序列而不是身份。” ~blogs.msdn.com/b/adonet/archive/2014/05/19/…
  • @AndrewDuffy 我看到许多不同的答案在发生变化,随着框架的更新和更新版本而变化。目前,公认的答案并不是最合适的。您介意修改和重新接受,以便为未来的读者指出哪个更受欢迎吗?

标签: c# entity-framework-core


【解决方案1】:

在最新版本的 EF7 中有一种新的扩展方法来设置标识列

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
  modelBuilder.Entity<MyEntity>(b =>
  {
    b.HasKey(e => e.Identifier);
    b.Property(e => e.Identifier).ValueGeneratedOnAdd();
  });
}

【讨论】:

  • 注意:ValueGeneratedOnAdd 实际上并没有将列设置为Identity 列,否则会失败。
  • 与官方文档证实:HasKeyValueGeneratedOnAdd
  • @ErikFunkenbusch 你确定吗?我read 相当于DatabaseGenerated 属性与身份!
  • @S.Serpooshan - 这不是官方文档。见ValueGeneradOnAdd 评论This just lets EF know that values are generated for added or updated entities, it does not guarantee that EF will setup the actual mechanism to generate values.
  • 我刚刚检查了生成的数据库,SQL Server 中的列定义是“Is Identity” = Yes
【解决方案2】:

由于 EF7 文档非常少,因此我们必须从源代码或单元测试中收集大部分知识。根据EF7源码中的以下两个单元测试...

HereHere

您可以像这样为 Identity 配置一个属性:

b.Property(e => e.Id).ForSqlServer().UseIdentity();

你会像这样为序列配置一个属性:

ForSqlServer().UseSequence();

由于 aspnet-core 重组,url 发生了变化,方法也发生了变化,因为这是第一次询问。

HereHere

if (_useSequence) 
{
    b.Property(e => e.Identifier).ForSqlServerUseSequenceHiLo();
} 
else 
{
    b.Property(e => e.Identifier).UseSqlServerIdentityColumn();
}

这些 url 可能会再次更改(这就是我包含相关代码的原因),但是只需查看 url 并访问该站点并找出新的 url 是什么就很容易了。

真的,我的答案的全部意义在于,您可以通过查看 GitHub 上源代码中的单元测试来自己解决这些问题。你不应该需要有人用勺子喂给你。

编辑:更新到 2.1 版的链接(仍然适用于 1.1 和 2.0)

【讨论】:

  • 我收到这个错误,我该如何解决?stackoverflow.com/questions/49715467/…
  • @AppleBook89 - 这似乎仍在使用,您是否包含正确的命名空间?查看当前的单元测试:docs.microsoft.com/en-us/dotnet/api/…
  • 我收到“MissingFieldException”:使用身份列时未找到字段。我找不到原因。我正在使用 DB First 方法。
  • @SuyashGupta - 这意味着预期的列未命名为 EF 所期望的。您可能必须手动映射它。
  • 代码和数据库中的列名相同。仅当我将主键设置为身份列时才会出现此问题。如果我删除了身份属性,则插入不会出现任何问题。
【解决方案3】:

看起来他们又改了一次,现在的新方法是:

.UseIdentityColumn()

【讨论】:

    【解决方案4】:

    对于最新的 EF Core 1.0 及更高版本,您应该使用

    builder.Entity<ApplicationUser>().Property<int>(nameof(ApplicationUser.AccountNo))
                .UseSqlServerIdentityColumn()
    

    【讨论】:

    • 谢谢。 UseSqlServerIdentityColumn 现在是如何完成的,包括 RC1 final,所以我猜这个 API 会坚持下去。
    • 谢谢,更新答案以明确表明支持 RC1
    【解决方案5】:

    如果您想要或它不是默认行为,这里是如何明确地做到这一点。

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {    
      modelBuilder.Entity<MyEntity>(b =>
      {
        b.Key(e => e.Identifier);
        b.Property(e => e.Identifier).ForSqlServer().UseIdentity();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-07
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2010-09-12
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多