【问题标题】:EF Core. Cannot insert explicit value for identity column in table 'Book' when IDENTITY_INSERT is set to OFFEF 核心。当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Book”中插入标识列的显式值
【发布时间】:2021-05-15 18:54:22
【问题描述】:

现在我正在将现有项目从网络框架迁移到网络核心。当它看起来工作时,我遇到了一个奇怪的异常。所有地方都为 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-core ef-core-3.1


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2019-11-29
      • 2016-05-13
      • 2016-08-18
      相关资源
      最近更新 更多