C# 使用DbContext将标识插入设置为On

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)

我正在使用实体框架dbcontext 我试图从我的“primaryIdField”代码中设置/重置identity_insert,但实体框架不知何故忽略了命令set identity_insert Database.dbo.mytable ON,并在数据库中插入数据库+1中primaryIdField=max(id)的新列

我所做的是

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; }
}
一些旁注:

  • 我相信你不必用手去做任何花哨的连接(但我可能错了)
  • 如果您使用的是EF6,则应使用
    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:我认为(某些)用例中此过程完全有效,即使我主要用于批量插入