Mak*_*aks 2 entity-framework-core ef-core-3.1
现在我正在致力于将现有项目从网络框架迁移到网络核心。当它看起来可以工作时,我遇到了一个奇怪的异常。所有地方都为数据库实体 PK 传递“-1”值,但它不适用于 ef core。下面是两个简单的再现测试。
// 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();
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了许多实体配置和状态的解决方法,但似乎没有任何效果。我相信这个问题已经有人解决了。请分享解决方案或您的想法。
小智 7
发生这种情况是因为对于 int 类型(和其他一些类型)的主键,EF Core 默认将数据库配置为在插入时生成相应的 id。因此数据库禁止提供像-1这样的显式值。如果您想自己生成 ids,请用 标记您的 Id 属性[DatabaseGenerated(DatabaseGeneratedOption.None)]。否则,不要显式为 Id 属性赋值,而是将其设置为默认值(在本例中为 0),EF 将插入您的实体并更新 Id 属性以匹配调用 SaveChanges() 时数据库生成的 Id 。
| 归档时间: |
|
| 查看次数: |
5281 次 |
| 最近记录: |