【问题标题】:EF Core Data Seeding (HasData method on modelBuilder) not inserting data for Identity columnEF Core 数据播种(modelBuilder 上的 HasData 方法)不为 Identity 列插入数据
【发布时间】:2020-12-21 12:35:19
【问题描述】:

我正在为具有 Id (Identity) 列的实体调用 HasData 方法(见下文),但在第一次运行迁移时没有数据插入到表中。

当 TestObject 模型没有使用 Id(身份)列作为主键时,数据在第一次运行迁移时按预期插入。

EF Core 是否能够为标识列插入数据?

modelBuilder.Entity<TestObject>().HasData(
            new TestObject
            {
                Id = 1,
                TestValue = "Test 1"
            }

【问题讨论】:

  • 嗯,HasData 需要提供 PK 值,因此它应该(应该)使用自动生成的(身份和类似的)密钥。您使用的是什么 EF Core 版本?以及哪个数据库提供商?
  • @IvanStoev 同意,​​我认为这应该也能正常工作,因为 HasData 需要键值。我正在使用 EF Core 3.1.10 和 SqlServer 提供程序。
  • 奇怪。您可以在干净的新数据库上尝试Update-Database -Verbose 并发布输出吗?希望您没有使用类似于 context.Database.EnsureCreated(); 的代码,因为它破坏了迁移系统。
  • 有趣的是......它开始工作了。不知道为什么,我在我的数据项目中做了一些小的重构,做了一些其他的小改动,清理/重建等,然后开始获取数据。但是,我真的很感谢你在这个问题上投入的时间,对不起,你不得不花时间在上面! @IvanStoev
  • 您是否创建了新的迁移?这些文章没有说明使用此方法后,您必须创建一个新的迁移,然后在该迁移中您将看到 migrationBuilder 使用您指定的数据直接调用InsertData

标签: entity-framework-core entity-framework-migrations


【解决方案1】:

如果数据库中的 PK 列是标识列(由数据库服务器创建),则您无法插入值。由数据库生成。

更新

正如下面的 cmets 中所指出的,EF Core 在执行 HasData() 时会调用“SET IDENTITY INSERT ON”。

https://www.learnentityframeworkcore.com/configuration/fluent-api/hasdata-method

【讨论】:

  • "那么你不能插入值" 其实你可以。例如,检查 SqlServer 中的身份插入,其他数据库的过程可能会有所不同。如何实现它是数据库提供者的责任。注意提供PK值是requirement (mandatory) for HasData: "主键值即使通常是由数据库生成的,也需要指定。它将用于检测迁移之间的数据变化。"我>
  • 感谢@IvanStoev,很好的参考。我也认为 EF Core 会在后台调用 set Ident Insert On,因为键值是必需的,这可能会发生,但奇怪的是我没有插入数据,但也没有异常表明有任何问题。
【解决方案2】:

功能开始按预期工作。不确定原因或解决方案,只是在数据项目中进行了更改,重构了一两个类,正常清理/重建,经过几个周期后,我开始在 Update-Database 上获取数据库中的数据。

【讨论】:

  • HasData 用于生成数据库迁移代码。并通过Update-Database生效。
猜你喜欢
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多