entity-framework-core - EF 核心。当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Book”中插入标识列的显式值
问题描述
现在我正在将现有项目从网络框架迁移到网络核心。当它看起来工作时,我遇到了一个奇怪的异常。所有地方都为 db 实体 PK 传递了“-1”值,但它不适用于 ef 核心。下面两个简单的复现测试。
// EF core test
[Test] // failed
public void Test1()
{
var options = new DbContextOptionsBuilder<ConsoleApp1.Context>()
.UseInMemoryDatabase(databaseName: "Data")
.ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning))
.Options;
var context = new ConsoleApp1.Context(options);
context.Books.Add(new ConsoleApp1.Book { Id = -1 });
context.Books.Add(new ConsoleApp1.Book { Id = 0 });
context.Books.Add(new ConsoleApp1.Book { Id = -1 });
Assert.Pass();
}
// EF 6 test
[Test] // passed
public void Test2()
{
var context = new ConsoleApp2.Context();
context.Books.Add(new ConsoleApp2.Book { Id = -1 });
context.Books.Add(new ConsoleApp2.Book { Id = 0 });
context.Books.Add(new ConsoleApp2.Book { Id = -1 });
Assert.Pass();
}
我已经尝试了许多有关实体配置和状态的解决方法,但似乎没有任何效果。我相信这个问题已经有人解决了。请分享解决方案或您的想法。
解决方案
发生这种情况是因为对于 int 类型的主键(和其他一些),EF Core 默认配置数据库以在插入时生成相应的 id。因此,数据库禁止提供像 -1 这样的显式值。如果您想自己处理生成 id,请使用 . 标记您的 Id 属性[DatabaseGenerated(DatabaseGeneratedOption.None)]
。否则,与其显式地将值赋给 Id 属性,不如让它成为默认值(在本例中为 0),EF 将插入您的实体并更新 Id 属性以匹配调用 SaveChanges() 时数据库生成的 Id .
推荐阅读
- moodle - 如何只向用户显示moodle测验而不输入moodle中的其他链接?
- vb.net - vb.net 中是否有替代的“电源”功能
- c++ - 出现错误:重新定义布尔队列
之前在这里声明过 - python - 在sqlalchemy中使用复合键删除多条记录
- python - 如何向从 CSV 文件中提取的自动完成功能添加更多行?
- javascript - Chrome-Devtools Snippets 中的多个 JS 库
- jquery - 如何在重复表单组中使用单选按钮
- applet - SIM 卡插入手机时,Applet 卸载不工作,收到 0x6985
- react-native - 每次在本机反应中重新渲染组件或在屏幕显示上调用函数
- powershell - 如果 vm 的数据存储有超过 %10 的可用空间,powercli 创建快照