首页 > 解决方案 > 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();
    }

我已经尝试了许多有关实体配置和状态的解决方法,但似乎没有任何效果。我相信这个问题已经有人解决了。请分享解决方案或您的想法。

标签: entity-framework-coreef-core-3.1

解决方案


发生这种情况是因为对于 int 类型的主键(和其他一些),EF Core 默认配置数据库以在插入时生成相应的 id。因此,数据库禁止提供像 -1 这样的显式值。如果您想自己处理生成 id,请使用 . 标记您的 Id 属性[DatabaseGenerated(DatabaseGeneratedOption.None)]。否则,与其显式地将值赋给 Id 属性,不如让它成为默认值(在本例中为 0),EF 将插入您的实体并更新 Id 属性以匹配调用 SaveChanges() 时数据库生成的 Id .


推荐阅读