使用DbContext设置标识插入

时间:2015-02-26 11:50:54

标签: c# entity-framework-5 dbcontext

我正在使用实体框架dbcontext 我正在尝试从我的代码中为我的' primaryIdField'设置/重置identity_insert。但是实体框架以某种方式忽略了命令SET IDENTITY_INSERT Database.dbo.mytable ON并在数据库中插入新列,其中primaryIdField = max(id)在数据库+ 1中,

我所做的是

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();
            }
        }

我做错了什么?

1 个答案:

答案 0 :(得分:2)

对于您的实际问题:默认情况下,EF会阻止您手动分配实体的主键(通过不在查询中发送值)。如果您想告诉EF您要完全执行此操作,则必须将[DatabaseGenerated(DatabaseGeneratedOption.None)]属性添加到您的实体的密钥声明中:

public class MyEntity 
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Key { get; set; }
}

一些旁注:

  1. 我相信你不必手工做任何关于连接的事情(但我可能错了)。
  2. 如果您使用的是EF6,则应使用context.Database.BeginTransaction()打开该交易。这是建议的方式:MSDN / Working with Transactions (EF6 Onwards)
  3. 我认为它不会产生巨大影响,但您可能应该使用context.Database.ExecuteSqlCommand()代替context.Database.SqlQuery<T>()