我试图做一个表,其中主键是一个记录插入Identity
字段。
我已经打过电话
mycontext.ExecuteCommand("SET identity_insert myTable ON")
但是这并没有什么好处。
我得到一个错误说IDENTITY_INSERT
为OFF
时,我提交更改。
我怎样才能把它ON
从C#代码之前,我提交更改?
编辑
我已阅读,这是因为ExecuteCommand代码获取不同的会话中执行。
编辑2
有没有什么办法可以执行一些DDL从我的C#代码中删除标识规范,执行插入,然后打开身份规格回来?
Answer 1:
你需要做在一个单一的T-SQL代码块中的所有步骤 - 这将是真的很难,如果不是不可能的,如果你想打开它,然后执行你的LINQ到SQL查询,然后将它关闭:(
唯一真正的解决方案我看到的是整个SQL打包成一个SQL语句并执行:
SET IDENTITY_INSERT MyTable ON
(do your update here)
SET IDENTITY_INSERT MyTable OFF
并执行,作为使用单个代码块.ExecuteContext()
渣
PS:你的编辑#2:没有,不幸的是,有没有(简单)的方式来删除某列的身份,并重新打开它。 Basicall你必须建立一个没有身份的新列,比的值复制,删除标识列,然后做向后当你做一样的 - 对不起! :-(
PS#2:这确实引出了一个问题:究竟是什么做的需要为做一个“标识插入”? 定期,从一个应用程序? 诚然 - 在我的应用程序肯定不......(只是好奇你的使用情况/动机是什么) - 你可能在一段时间碰上这种需要一次,但我总是这样做分开,在SQL管理工作室。
Answer 2:
另一种选择是包装在一个TransactionScope所有LINQ2SQL()的调用。 这应该强制他们都在同一个连接上运行。
using System.Transactions; // Be sure to add a reference to System.Transactions.dll to your project.
// ... in a method somewhere ...
using (System.Transaction.TransactionScope trans = new TransactionScope())
{
using(YourDataContext context = new YourDataContext())
{
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
context.ExecuteCommand("yourInsertCommand");
context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");
}
trans.Complete();
}
// ...
尽管如此,如果你正在尝试做一些事情,如:
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
context.MyTable.InsertOnSubmit(myTableObject)
context.SubmitChanges()
context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");
你可能会遇到的其他问题,特别是如果身份列具有IsDbGenerated属性设置为true。 通过LINQ2SQL生成的SQL命令不知道要包括标识列和值。
Answer 3:
它应该是足够的执行命令之前手动打开连接。 这使得在同一会话中运行命令:
context.Connection.Open();
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
// make changes
// ...
context.SubmitChanges();
Answer 4:
我所做的就是这样的事情(Nbuider用于创建实体)。 我创建除了标识插入行通常都行; 这到底做了些什么。 这是测试数据生成,因此并不需要交易。
using (var entitiesEfContext = new ContextABC())
{
var platforms = Builder<Platform>
.CreateListOfSize(4)
.TheFirst(1)
.With(x => x.Description = "Desc1")
.With(x => x.IsDeleted = false)
.TheNext(1)
.With(x => x.Description = "Desc2")
.With(x => x.IsDeleted = false)
.TheNext(1)
.With(x => x.Description = "Desc3")
.With(x => x.IsDeleted = false)
.TheNext(1)
.With(x => x.Description = "Desc4")
.With(x => x.IsDeleted = false)
.Build();
foreach (var platform in platforms)
{
entitiesEfContext.Platform.AddObject(platform);
}
entitiesEfContext.SaveChanges();
// the identity insert row (o as id in my case)
entitiesEfContext.ExecuteStoreCommand("SET IDENTITY_INSERT Platform ON; INSERT INTO [Platform](Platformid,[Description],[IsDeleted],[Created],[Updated]) VALUES (0,'Desc0' ,0 ,getutcdate(),getutcdate());SET IDENTITY_INSERT Platform Off");
}
Answer 5:
我有同样的错误消息。 我通过更改表的主键的属性解决。
MyTable.MyId int IDENTITY(1,1) NOT NULL
该属性设置身份识别码(在DBML)
- 自动生成的值:True;
- 自动同步:OnInsert;
- 主键: 真 ;
- 服务器数据类型:int NOT NULL身份 ;
- 类型:int;
Answer 6:
只是简单的reseed identity key
(通过自定义ID),每次添加新的记录,如时间:
using (var desDb = new DesDbContext())
{
// del-table-all --------------------------------------------------------
desDb.Database.ExecuteSqlCommand("DELETE FROM [Products]");
foreach (var desItem in desList) //desList is List of Product
{
// reseed identity key
desDb.Database.ExecuteSqlCommand("DBCC CHECKIDENT('Products', RESEED,"
+ (desItem.ProductID - 1) + ");");
// and record
desDb.Products.Add(desItem);
// save-db
desDb.SaveChanges();
}
}
文章来源: Linq To Sql and identity_insert