标签: identity-insert

如何在运行时在DatabaseGeneratedOption.Identity,Computed和None之间切换,而不必生成空的DbMigrations

我正在将一个遗留数据库迁移到一个新数据库,我们需要主要通过Entity Framework Code-First来访问和"管理"(尽管它可能听起来像是一样).

我们正在使用MS SQL Server 2014.

  1. 遗留数据库包含一些带有计算列的表.典型的GUID和DateTime的东西.

  2. 从技术上讲,这些列没有计算列规范,而是使用NEWID()和给定默认值GETDATE()

我们都知道配置DbContext处理这些属性非常容易,如下所示:

modelBuilder.Entity<Foo>()
            .Property(t => t.Guid)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
modelBuilder.Entity<Bar>()
            .Property(t => t.DTS)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
Run Code Online (Sandbox Code Playgroud)

上述内容将指示实体框架忽略在INSERTs和期间提交此类属性的任何提供值UPDATEs.

  1. 但现在我们需要允许导入旧记录并维护OLD值,包括PRIMARY KEY,标记为IDENTITY

    1. 这意味着我们将不得不设置Id,Guid以及DTS性能DatabaseGeneratedOption.None,同时插入这些记录.

    2. 对于这种情况Id,我们必须以某种方式SET IDENTITY_INSERT ... ON/OFF在连接会话中执行.

    3. 我们也希望通过Code-First执行此导入过程.

  2. 如果我修改模型并"临时"并DatabaseGeneratedOption.None在创建数据库之后将这些属性设置为,我们将得到典型的:

    自创建数据库以来,支持上下文的模型已更改.考虑使用Code First Migrations来更新数据库.

  3. 我知道我们可以生成一个空的编码迁移,-IgnoreChanges以"建立"这个最新版本的上下文,但这不是一个可接受的策略,因为我们必须来回运行空迁移这个目的.


半个答案:

我们考虑过将这些属性赋予可空类型,即

public class Foo
{
    ...
    public Guid? Guid { get; …
Run Code Online (Sandbox Code Playgroud)

sql-server entity-framework identity-insert ef-code-first ef-migrations

7
推荐指数
1
解决办法
3281
查看次数

SQL Server 2019 行为随 SET IDENTITY_INSERT ON/OFF 范围的变化

我们正在迁移到 SQL Server 2019 RTM 版本,并注意到我们使用SET IDENTITY_INSERTON/OFF 语句的存储过程之一失败,但在 SQL Server 2017 及更早版本中正常工作。

即使将兼容性级别更改为 SQL Server 2017,在 SQL Server 2019 中的工作方式也不同。这看起来像是一个没有记录在案的错误/行为更改。

任何人遇到类似问题或知道这是否是报告的问题?我尝试搜索它,但报告该问题的另一个人是 ODBC 和 SQL Server 2019 CTP 版本的组合。

我们有很多客户在 SQL Server 2017 及更早版本上运行我们产品的早期版本,我们无法更改这些存储过程,但仍想迁移到 SQL Server 2019,现在这已成为我们 SQL Server 2019 迁移的阻碍.

这是在 SQL Server 2019 中失败但在 SQL Server 2017 及更早版本中运行良好的代码片段

如何重现行为。

CREATE PROC proc_inner
AS
BEGIN
    SET IDENTITY_INSERT [#TMP_MESSAGE] ON;

    INSERT INTO [#TMP_MESSAGE] (DCORP, ENTITYKEY, SEQNO, MESSAGE)
        SELECT 
            'test', 1, 1, 'bdkfsjk';

    SET IDENTITY_INSERT #TMP_MESSAGE OFF;
END;
GO

CREATE …
Run Code Online (Sandbox Code Playgroud)

identity-insert sql-server-2019

7
推荐指数
1
解决办法
616
查看次数

Linq to SQL:为什么我收到IDENTITY_INSERT错误?

我正在使用Linq to SQL.我有一个DataContext,我就是.SubmitChanges()'.插入标识字段时出错:

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

唯一的标识字段是"ID",其值为0.它在DBML中定义为:

[Column(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
Run Code Online (Sandbox Code Playgroud)

有几个外键,我已经验证它们的值与外表的内容一致.

为什么我会收到此错误?

编辑:这是查询:

exec sp_executesql N'INSERT INTO [dbo].[Rigs]([id], [Name], [RAM], [Usage], [MoreInfo], [datetime], [UID])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)
SELECT [t0].[id], [t0].[OSID], [t0].[Monitors]
FROM [dbo].[Rigs] AS [t0]
WHERE [t0].[id] = @p7',N'@p0 int,@p1 varchar(1),@p2 int,@p3 varchar(1),@p4 varchar(1),@p5 datetime,@p6 int,@p7 
int',@p0=0,@p1='1',@p2=NULL,@p3='4',@p4='5',@p5=''2009-03-11 20:09:15:700'',@p6=1,@p7=0
Run Code Online (Sandbox Code Playgroud)

尽管从未被赋予价值,但显然它正在传递零.

编辑:添加代码:

Rig rig = new Rig();
int RigID;
try
{ // Confirmed these always contain a nonzero value or blank
    RigID = int.Parse(lbSystems.SelectedValue …
Run Code Online (Sandbox Code Playgroud)

c# linq identity-insert linq-to-sql

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

在表上打开IDENTITY_INSERT以使用DB Unit加载它

我尝试使用DB Unit加载具有标识列的表.我希望能够自己设置id值(我不希望数据库为我生成它).

这是我的表的最小定义

create table X (
 id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

要在X中插入一行,我执行以下SQL

set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
Run Code Online (Sandbox Code Playgroud)

没问题.但是当我尝试使用以下数据库单元XML数据集(RS_7_10_minimal_ini.xml)加载此表时

<dataset>
 <X id="666"/>
</dataset>
Run Code Online (Sandbox Code Playgroud)

使用以下最小JUnit(DBTestCase)测试用例:

package lms.lp.functionnal_config;

import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import lms.DBUnitConfig;
import org.junit.Test;

public class SampleTest extends DBTestCase

{

public SampleTest(String name)

{
    super( name );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD );

}

protected IDataSet getDataSet() throws …
Run Code Online (Sandbox Code Playgroud)

sybase junit dbunit identity-insert identity-column

5
推荐指数
1
解决办法
4793
查看次数

无法批量设置IDENTITY_INSERT

案件

目前我正在研究数据库种子脚本,用sqlcmd.执行.例如这个脚本示例:

IF (SELECT COUNT(*) FROM Genders)=0
BEGIN
   PRINT N'Seeding table Genders...'

   SET IDENTITY_INSERT Genders ON
   GO

   INSERT INTO Genders (GenderId, Description) VALUES (0, 'Onbekend');
   INSERT INTO Genders (GenderId, Description) VALUES (1, 'Vrouw');
   INSERT INTO Genders (GenderId, Description) VALUES (2, 'Man');
   INSERT INTO Genders (GenderId, Description) VALUES (3, 'Onzijdig');
   INSERT INTO Genders (GenderId, Description) VALUES (4, 'Vrouwman');
   INSERT INTO Genders (GenderId, Description) VALUES (5, 'Manvrouw');

   SET IDENTITY_INSERT Genders OFF
END
GO
Run Code Online (Sandbox Code Playgroud)

问题

但是,如果我sqlcmd在SQL Server Management Studio中使用模式执行它,它会给我这个错误: …

sql t-sql sqlcmd identity-insert sql-server-2008

5
推荐指数
1
解决办法
2523
查看次数

Sql Server Ce 3.5标识插入

在Sql Server CE中出现了标识列的问题

使用Server explorer时,在VS2008中,执行以下脚本

SET IDENTITY_INSERT testTable ON; 插入testTable(id,name)值(1,'Something')SET IDENTITY_INSERT testTable ON;

发送以下消息错误'不支持Set SQL构造或语句.但然后插入行好吗?!?!?!

无论如何,当我尝试通过C#做同样的事情时,将该脚本作为命令文本,它无法说错误在"插入关键字"中

我理解,对于SQL SERVER CE,该命令当时只接受一个批处理命令,所以在这种情况下我们有三个命令(它可以与完整的SQLServer一起工作)任何想法?

c# sql-server compact-framework identity-insert

3
推荐指数
1
解决办法
9408
查看次数

我将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
查看次数

游标内部的IDENTITY_INSERT ON不允许插入id

我试图为数据库中的一堆行设置一些id,其中id列是一个标识.

我创建了一个游标来遍历行并使用递增的负数(-1,-2,-3等)更新id.

当我只更新一行打开IDENTITY_INSERT它工作正常,但一旦我尝试在游标中使用它,它会抛出以下错误.

消息8102,级别16,状态1,行22无法更新标识列'myRowID'.

DECLARE @MinId  INT;
SET @MinId = (SELECT MIN(myRowId) FROM myTable)-1;

DECLARE myCursor CURSOR
FOR
SELECT myRowId
FROM dbo.myTable
WHERE myRowId > 17095

OPEN myCursor 
DECLARE @myRowId INT

FETCH NEXT FROM myCursor INTO @myRowId
WHILE (@@FETCH_STATUS <> -1)
BEGIN

SET IDENTITY_INSERT dbo.myTable ON;

--UPDATE dbo.myTable
--SET myRowId = @MinId
--WHERE myRowId = @myRowId;

PRINT (N'ID: ' + CAST(@myRowId AS VARCHAR(10)) + N' NewID: ' + CAST(@MinId AS VARCHAR(4)));
SET @MinId = @MinId - 1;
FETCH NEXT FROM …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server cursor identity-insert

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

当IDENTITY_INSERT设置为OFF时,无法在表中插入标识列的显式值

我正在尝试在具有标识列的表中插入记录.由于各种原因,这不应该是直接插入,但它应具有与外表相同的ID.所以我跑:

EXECUTE ('SET IDENTITY_INSERT RemoteDB.dbo.FrameContent ON')

INSERT INTO [RemoteDB].[dbo].[FrameContent] ([ID],[FrameID],[PacketType]) 
SELECT [ID],[FrameID],[PacketType]
FROM FrameContent 
WHERE [ID] NOT IN (SELECT [ID] FROM [RemoteDB].[dbo].[FrameContent])
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Cannot insert explicit value for identity column in table 'FrameContent' when IDENTITY_INSERT is set to OFF.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?它抱怨IDENTITY_INSERT不应该关闭,但我将其设置为ON.

sql insert identity-insert

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

SQL Server 2008 R2 - 为什么我的临时表认为它有一个标识列?

我正在尝试创建一个存储过程,它将能够限制使用部门ID返回的记录数.我试图通过加入临时表来限制记录.

当我运行下面的代码时,我得到错误:

只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'#department'中标识列的显式值.

这是代码:

DECLARE @departmentID INT
SET @departmentID = 4

-- create temp department table --
select top 0 * into #department from PayrollDepartment

-- load temp department table
IF @departmentID < 1 OR @departmentID IS NULL
BEGIN
    INSERT INTO #department SELECT * FROM PayrollDepartment
END 
ELSE
BEGIN
    INSERT INTO #department SELECT * FROM PayrollDepartment WHERE PayrollDepartmentID =     @departmentID
END
Run Code Online (Sandbox Code Playgroud)

我开始时:

IF @departmentID < 1 OR @departmentID IS NULL
BEGIN
    SELECT * INTO #department FROM ApplicationEmployeeInfo..PayrollDepartment
END 
ELSE
BEGIN …
Run Code Online (Sandbox Code Playgroud)

sql temp-tables identity-insert sql-server-2008-r2

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