【问题标题】:EF Cannot insert explicit value for identity column in table 'X' when IDENTITY_INSERT is set to OFF当 IDENTITY_INSERT 设置为 OFF 时,EF 无法为表“X”中的标识列插入显式值
【发布时间】:2018-11-25 04:30:22
【问题描述】:

我必须将数据从一个数据库迁移到另一个数据库。应保留密钥。 我将 EF 与自动生成的 .dbmx 文件一起使用。我已经阅读了许多类似问题的答案并遵循了这些建议:我确实在插入条目之前将IDENTITY_INSERT 开启;在数据库图表上,我将Id 列上的StoreGeneratedPattern 更改为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 中执行此操作时,效果很好。该问题仅在使用实体框架时出现。

我可以在 SQL Server Profiler 中看到 INSERT_IDENTITY 命令已执行并且插入 SQL 带有 Id 列,但似乎没有执行,这看起来很奇怪。当我复制粘贴此 SQL 查询时,它工作得很好。

【问题讨论】:

    标签: c# entity-framework ef-database-first identity-insert


    【解决方案1】:

    问题是 EDMX 和 Designer.cs 文件是在您编译之前生成的,当您从数据库生成架构并且不更改时。验证是针对那些文件中的内容运行的。他们希望启用 identify_insert 属性,因此当您在数据库中以编程方式禁用它时,EF 层会抛出您遇到的异常。基本上是说-您的数据库与我的数据库不匹配。

    老实说,以这种方式进行大型表数据传输并不是 EF 的设计目的。你应该使用Bulk Data Copy

    【讨论】:

    • 感谢您的快速回答。你说的部分正确。但我更改了 Id 列的 EDMX 图行为。
    猜你喜欢
    • 2016-05-13
    • 2012-11-10
    • 2019-03-10
    • 2021-07-02
    • 2016-01-20
    • 2018-06-29
    • 2016-08-18
    相关资源
    最近更新 更多