我正在将一个遗留数据库迁移到一个新数据库,我们需要主要通过Entity Framework Code-First来访问和"管理"(尽管它可能听起来像是一样).
我们正在使用MS SQL Server 2014.
遗留数据库包含一些带有计算列的表.典型的GUID和DateTime的东西.
从技术上讲,这些列没有计算列规范,而是使用NEWID()和给定默认值GETDATE()
我们都知道配置DbContext处理这些属性非常容易,如下所示:
modelBuilder.Entity<Foo>()
            .Property(t => t.Guid)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
modelBuilder.Entity<Bar>()
            .Property(t => t.DTS)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
上述内容将指示实体框架忽略在INSERTs和期间提交此类属性的任何提供值UPDATEs.
但现在我们需要允许导入旧记录并维护OLD值,包括PRIMARY KEY,标记为IDENTITY 
这意味着我们将不得不设置Id,Guid以及DTS性能DatabaseGeneratedOption.None,同时插入这些记录.
对于这种情况Id,我们必须以某种方式SET IDENTITY_INSERT ... ON/OFF在连接会话中执行.
我们也希望通过Code-First执行此导入过程.
如果我修改模型并"临时"并DatabaseGeneratedOption.None在创建数据库之后将这些属性设置为,我们将得到典型的:
自创建数据库以来,支持上下文的模型已更改.考虑使用Code First Migrations来更新数据库.
我知道我们可以生成一个空的编码迁移,-IgnoreChanges以"建立"这个最新版本的上下文,但这不是一个可接受的策略,因为我们必须来回运行空迁移这个目的.
我们考虑过将这些属性赋予可空类型,即
public class Foo
{
    ...
    public Guid? Guid { get; …sql-server entity-framework identity-insert ef-code-first ef-migrations
我们正在迁移到 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 …我正在使用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)]
有几个外键,我已经验证它们的值与外表的内容一致.
为什么我会收到此错误?
编辑:这是查询:
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
尽管从未被赋予价值,但显然它正在传递零.
编辑:添加代码:
Rig rig = new Rig();
int RigID;
try
{ // Confirmed these always contain a nonzero value or blank
    RigID = int.Parse(lbSystems.SelectedValue …我尝试使用DB Unit加载具有标识列的表.我希望能够自己设置id值(我不希望数据库为我生成它).
这是我的表的最小定义
create table X (
 id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
要在X中插入一行,我执行以下SQL
set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
没问题.但是当我尝试使用以下数据库单元XML数据集(RS_7_10_minimal_ini.xml)加载此表时
<dataset>
 <X id="666"/>
</dataset>
使用以下最小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 …案件
目前我正在研究数据库种子脚本,用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
问题
但是,如果我sqlcmd在SQL Server Management Studio中使用模式执行它,它会给我这个错误: …
在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一起工作)任何想法?
我试图从文本文件中获取数千张发票(和其他东西)并将它们插入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 */
)
在我开始插入发票之前,我调用包含以下行的存储过程:
SET IDENTITY_INSERT [dbo].[Invoice] ON;
/* Other lines for setup elided */
在我提交更改后,我使用以下行调用另一个存储过程:
SET IDENTITY_INSERT [dbo].[Invoice] OFF;
/* Other lines for clean up elided */
当我尝试插入发票并提交更改时,我收到以下异常:
SQLException:当IDENTITY_INSERT设置为OFF时,无法在表'Invoice'中为identity列插入显式值.
我运行SQL事件探查器,我可以看到它确实设置IDENTITY_INSERT为ON尝试执行插入之前.我不认为它被设置在OFF任何地方.我是SQL Profiler的新手,所以也许我可以启用一个事件,它将为我提供更多信息来尝试和调试它.有任何想法吗?  
我已经尝试调整LINQ to SQL使用的.dbml文件中的值.我将Invoice表Auto Generated Value设置为"False",Auto-Sync设置为"Never",Server Data Type设置为"Int NOT NULL".通常我会将它们分别设置为"True","On Insert"和"Int NOT NULL IDENTITY",但是当我这样做时,我可以看到SQL …
我试图为数据库中的一堆行设置一些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 …我正在尝试在具有标识列的表中插入记录.由于各种原因,这不应该是直接插入,但它应具有与外表相同的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])
我收到错误:
Cannot insert explicit value for identity column in table 'FrameContent' when IDENTITY_INSERT is set to OFF.
有任何想法吗?它抱怨IDENTITY_INSERT不应该关闭,但我将其设置为ON.
我正在尝试创建一个存储过程,它将能够限制使用部门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
我开始时:
IF @departmentID < 1 OR @departmentID IS NULL
BEGIN
    SELECT * INTO #department FROM ApplicationEmployeeInfo..PayrollDepartment
END 
ELSE
BEGIN …identity-insert ×10
c# ×3
sql ×3
sql-server ×3
linq-to-sql ×2
t-sql ×2
.net ×1
cursor ×1
dbunit ×1
identity ×1
insert ×1
junit ×1
linq ×1
sqlcmd ×1
sybase ×1
temp-tables ×1