相关疑难解决方法(0)

实体框架:IDENTITY_INSERT问题 - "无法在表中插入标识列的显式值"

我正在使用带有C#.NET的Entity Framework 4.0.我正在尝试创建一个"简单"的迁移工具,将数据从一个表转换为另一个表(表格不一样)

该数据库是SQL Server 2005.

我有一个类似于以下目标DB结构:

MYID - int, primary key, identity specification (yes)
MYData - varchar(50)
Run Code Online (Sandbox Code Playgroud)

在我的迁移程序中,我将DB结构导入edmx.然后我手动关闭StoreGeneratedPattern.

在我的迁移程序中,我按如下方式关闭标识列(我已经确认它确实将其关闭):

            using (newDB myDB = new newDB())
            {
                //turn off the identity column 
                myDB.ExecuteStoreCommand("SET IDENTITY_INSERT SR_Info ON");
            }
Run Code Online (Sandbox Code Playgroud)

在上面的代码之后,我有以下代码:

            using (newDB myDB = new newDB())
            {
                DB_Record myNewRecord = new DB_Record();
                //{do a bunch of processing}
                myNewRecord.MYID = 50;
                myDB.AddToNewTable(myNewRecord);
                myDB.SaveChanges();
            }
Run Code Online (Sandbox Code Playgroud)

当它到达myD​​B.SaveChanges()时,它会生成一个异常:"无法为表中的标识列插入显式值".

我知道当我手动转到SQL Server表并关闭身份规范时,代码工作正常.

我的偏好是让迁移工具处理打开和关闭身份规范,而不必在数据库上手动执行.此迁移工具将用于沙箱数据库,开发人员数据库,QA数据库,然后是生产数据库,因此完全自动化将很好.

让这个工作正常的任何想法?

我使用了以下步骤:

  1. 使用标识列创建数据库表.
  2. 在Visual Studio中,添加新的EDMX.
  3. 在EDMX上,我从数据库中选择更新模型(并选择添加所需的表)
  4. 在EDMX上,我单击MYID,在属性窗格中,我将StoreGeneratedProcedure设置为None.

此时,当我添加一个设置了MYID的新记录时,DB会使用Identity值覆盖MYID的值.

到目前为止,无论我在哪里添加"myDB.ExecuteStoreCommand("SET IDENTITY_INSERT SR_Info ON");",它的行为都是一样的.

我试过添加一个存储过程,它也无法正常工作.

我怀疑最终,迁移不会完全自动化.

c# entity-framework-4

9
推荐指数
2
解决办法
2万
查看次数

我将IDENTITY_INSERT设置为ON,但是我得到一个SqlException,表示它已关闭

我试图从文本文件中获取数千张发票(和其他东西)并将它们插入SQL Server 2008.我写了一个小控制台应用程序来执行此操作并使用LINQ to SQL.在我插入所有现有发票之后,我希望它Invoice_ID是一个标识列并自动增加,所以我将它设计为:

CREATE TABLE [dbo].[Invoice]
(
 [Invoice_ID] int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    /* Other fields elided */
)
Run Code Online (Sandbox Code Playgroud)

在我开始插入发票之前,我调用包含以下行的存储过程:

SET IDENTITY_INSERT [dbo].[Invoice] ON;
/* Other lines for setup elided */
Run Code Online (Sandbox Code Playgroud)

在我提交更改后,我使用以下行调用另一个存储过程:

SET IDENTITY_INSERT [dbo].[Invoice] OFF;
/* Other lines for clean up elided */
Run Code Online (Sandbox Code Playgroud)

当我尝试插入发票并提交更改时,我收到以下异常:

SQLException:当IDENTITY_INSERT设置为OFF时,无法在表'Invoice'中为identity列插入显式值.

我运行SQL事件探查器,我可以看到它确实设置IDENTITY_INSERTON尝试执行插入之前.我不认为它被设置在OFF任何地方.我是SQL Profiler的新手,所以也许我可以启用一个事件,它将为我提供更多信息来尝试和调试它.有任何想法吗?

我已经尝试调整LINQ to SQL使用的.dbml文件中的值.我将InvoiceAuto Generated Value设置为"False",Auto-Sync设置为"Never",Server Data Type设置为"Int NOT NULL".通常我会将它们分别设置为"True","On Insert"和"Int NOT NULL IDENTITY",但是当我这样做时,我可以看到SQL …

.net c# identity identity-insert linq-to-sql

2
推荐指数
1
解决办法
3401
查看次数