gpt4 book ai didi

c# - SET IDENTITY_INSERT TableName ON 在 Entity Framework Core 2.2 上不起作用

转载 作者:行者123 更新时间:2023-12-04 12:17:04 24 4
gpt4 key购买 nike

我正在尝试将一条记录插入到自动生成 ID 的表中。
出于这个原因,这是我的代码:

using (var context = new DbContext(GetConnection().Options))
{
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Customers ON;");
context.SaveChanges();
context.Customers.Add(customer);
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Customers OFF;");
}

但异常(exception)总是一样的:

Cannot insert explicit value for identity column in table 'Customers' when IDENTITY_INSERT is set to OFF.



我也尝试执行命令 SET IDENTITY_INSERT dbo.Customers ON在 SQL Server Management Studio 中手动并在执行上面的代码后,但抛出相同的异常。

为什么?

最佳答案

默认情况下,当您尝试为标识列插入值时, Entity Framework 将抛出​​您遇到的错误。即使您启用 identity_insert ,它将在数据库级别而不是 Entity Framework 。

为了克服这个问题,您已经完成了第一步。但是作为第二步,您需要告诉 Entity Framework 这个字段是可插入的。你可以用 2 种不同的方式来做到这一点。

  • 转到您的模型类,并添加 [DatabaseGenerated(DatabaseGeneratedOption.None)]到您的身份栏。使用此方法,您可以插入带有标识列的记录,而无需依赖于事务。
  • 此外,您可以在同一个连接中执行整个代码。这样,当您尝试插入记录时,EF Core 不会抛出错误。请检查以下代码。
    using (var db = new Context())
    {
    db.Categories.Add(new Category
    {
    Id = 5,
    Name = "test"
    });

    db.Database.OpenConnection();
    try
    {
    db.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Categories ON;");
    db.SaveChanges();
    db.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Categories OFF;");
    }
    finally
    {
    db.Database.CloseConnection();
    }
    }

  • 更新
    HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)也可以在仅使用 Entity Framework 时使用。 Entity Framework Core Fluent API 没有实现 HasDatabaseGeneratedOption(DatabaseGeneratedOption.None) .

    关于c# - SET IDENTITY_INSERT TableName ON 在 Entity Framework Core 2.2 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58841616/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com