SET IDENTITY_INSERT TableName ON 在 Entity Framework Core 2.2 上不起作用
SET IDENTITY_INSERT TableName ON does not work on Entity Framework Core 2.2
我正在尝试将记录插入到 table 中,该记录已自动生成 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;");
}
但例外总是一样的:
Cannot insert explicit value for identity column in table 'Customers' when IDENTITY_INSERT is set to OFF.
我还尝试在 SQL Server Management Studio 中手动执行命令 SET IDENTITY_INSERT dbo.Customers ON
并在执行上面的代码后抛出相同的异常。
为什么?
默认情况下,Entity Framework 将抛出您在尝试为标识列插入值时遇到的错误。即使您启用 identity_insert
,它也会在数据库级别而不是 Entity Framework。
要克服这个问题,您已经完成了第一步。但是作为第二步,您需要告诉 Entity Framework 这个字段是可插入的。你可以用两种不同的方式来做到这一点。
转到您的模型 class,然后将 [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)
。
我正在尝试将记录插入到 table 中,该记录已自动生成 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;");
}
但例外总是一样的:
Cannot insert explicit value for identity column in table 'Customers' when IDENTITY_INSERT is set to OFF.
我还尝试在 SQL Server Management Studio 中手动执行命令 SET IDENTITY_INSERT dbo.Customers ON
并在执行上面的代码后抛出相同的异常。
为什么?
默认情况下,Entity Framework 将抛出您在尝试为标识列插入值时遇到的错误。即使您启用 identity_insert
,它也会在数据库级别而不是 Entity Framework。
要克服这个问题,您已经完成了第一步。但是作为第二步,您需要告诉 Entity Framework 这个字段是可插入的。你可以用两种不同的方式来做到这一点。
转到您的模型 class,然后将
[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)
。