EF 核心。当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Book”中插入标识列的显式值

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 。