C# 使用DbContext将标识插入设置为On
我正在使用实体框架dbcontext 我试图从我的“primaryIdField”代码中设置/重置identity_insert,但实体框架不知何故忽略了命令set identity_insert Database.dbo.mytable ON,并在数据库中插入数据库+1中primaryIdField=max(id)的新列 我所做的是C# 使用DbContext将标识插入设置为On,c#,entity-framework-5,dbcontext,C#,Entity Framework 5,Dbcontext,我正在使用实体框架dbcontext 我试图从我的“primaryIdField”代码中设置/重置identity_insert,但实体框架不知何故忽略了命令set identity_insert Database.dbo.mytable ON,并在数据库中插入数据库+1中primaryIdField=max(id)的新列 我所做的是 using (var context = DbManager.GetEntityContext(myConnectionString).MyContext)
using (var context = DbManager.GetEntityContext(myConnectionString).MyContext)
{
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
context.Database.Connection.Open();
context.Database.SqlQuery<int>("SET IDENTITY_INSERT Database.dbo.mytable ON");
context.Set<MyModel>().Add(myModel);
context.SaveChanges();
context.Database.SqlQuery<int>("SET IDENTITY_INSERT Database.dbo.mytable OFF");
scope.Complete();
}
}
使用(var context=DbManager.GetEntityContext(myConnectionString.MyContext)
{
使用(var scope=newtransactionscope(TransactionScopeOption.RequiresNew))
{
context.Database.Connection.Open();
SqlQuery(“设置IDENTITY_INSERT Database.dbo.mytable ON”);
context.Set().Add(myModel);
SaveChanges();
SqlQuery(“SET IDENTITY_INSERT Database.dbo.mytable OFF”);
scope.Complete();
}
}
我做错了什么?针对您的实际问题:默认情况下,EF将阻止您手动分配实体的主键(不在查询中发送值)。如果您想告诉EF您想准确地执行此操作,则必须将
[DatabaseGenerated(DatabaseGeneratedOption.None)]
属性添加到实体的密钥声明中:
public class MyEntity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Key { get; set; }
}
一些旁注:
context.Database.BeginTransaction()
打开事务。建议这样做:context.Database.ExecuteSqlCommand()
而不是context.Database.SqlQuery()
你为什么这样做?让SQL server插入下一个ID不是更合适吗?通常,您只在希望从另一个数据库复制行并保留原始主键的情况下使用Identity Insert。在这种情况下,您似乎只是添加了一条新记录;在这种情况下,您应该让SQL处理该行的新键值。使用设计器中的Indentiy specification属性或“CREATE TABLE[dbo].[myTable]([ID][int]IDENTITY(1,1)NOT NULL,…”设置主键字段,如果Oracle需要触发器。@TechneWare:我认为(某些)用例中此过程完全有效,即使我主要用于批量插入