当 IDENTITY_INSERT 设置为 OFF 时,EF 无法在 table 'X' 中为标识列插入显式值
EF Cannot insert explicit value for identity column in table 'X' when IDENTITY_INSERT is set to OFF
我必须将数据从一个数据库迁移到另一个数据库。应保留密钥。
我将 EF 与自动生成的 .dbmx
文件一起使用。我已经阅读了很多类似问题的答案并遵循了这些建议:我确实在插入条目之前打开 IDENTITY_INSERT
;在数据库图表上,我将 StoreGeneratedPattern
更改为 Id
列上的 None
(也尝试将相应的属性添加到 Id
属性)。
这是我的代码:
var myEntity = new MyTable
{
Id = 12345,
Name = "Lorem ipsum",
BrandId = brandId,
};
MyContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT MY_TABLE_NAME ON");
MyContext.MyTable.Add(myEntity);
await MyContext.SaveChangesAsync(); //getting error here
在 Management Studio 中执行此操作时,效果很好。该问题仅在使用 Entity Framework.
时出现
我在 SQL Server Profiler 中看到执行了 INSERT_IDENTITY
命令并插入 SQL 带有 Id
列,但似乎不是执行。当我复制粘贴此 SQL 查询时,它工作得很好。
问题是 EDMX 和 Designer.cs 文件是在您编译之前生成的,当您从数据库生成模式并且不更改时。验证是 运行 针对那些文件中的内容。他们希望启用 identify_insert 属性,因此当您以编程方式在数据库中禁用它时,EF 层会抛出您遇到的异常。基本上是说 - 你的数据库与我的不匹配。
老实说,以这种方式进行大型 table 数据传输并不是 EF 的设计目的。你应该使用 Bulk Data Copy
我必须将数据从一个数据库迁移到另一个数据库。应保留密钥。
我将 EF 与自动生成的 .dbmx
文件一起使用。我已经阅读了很多类似问题的答案并遵循了这些建议:我确实在插入条目之前打开 IDENTITY_INSERT
;在数据库图表上,我将 StoreGeneratedPattern
更改为 Id
列上的 None
(也尝试将相应的属性添加到 Id
属性)。
这是我的代码:
var myEntity = new MyTable
{
Id = 12345,
Name = "Lorem ipsum",
BrandId = brandId,
};
MyContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT MY_TABLE_NAME ON");
MyContext.MyTable.Add(myEntity);
await MyContext.SaveChangesAsync(); //getting error here
在 Management Studio 中执行此操作时,效果很好。该问题仅在使用 Entity Framework.
时出现我在 SQL Server Profiler 中看到执行了 INSERT_IDENTITY
命令并插入 SQL 带有 Id
列,但似乎不是执行。当我复制粘贴此 SQL 查询时,它工作得很好。
问题是 EDMX 和 Designer.cs 文件是在您编译之前生成的,当您从数据库生成模式并且不更改时。验证是 运行 针对那些文件中的内容。他们希望启用 identify_insert 属性,因此当您以编程方式在数据库中禁用它时,EF 层会抛出您遇到的异常。基本上是说 - 你的数据库与我的不匹配。
老实说,以这种方式进行大型 table 数据传输并不是 EF 的设计目的。你应该使用 Bulk Data Copy