我正在使用实体框架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();
}
}
我做错了什么?
答案 0 :(得分:2)
对于您的实际问题:默认情况下,EF会阻止您手动分配实体的主键(通过不在查询中发送值)。如果您想告诉EF您要完全执行此操作,则必须将[DatabaseGenerated(DatabaseGeneratedOption.None)]
属性添加到您的实体的密钥声明中:
public class MyEntity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Key { get; set; }
}
一些旁注:
context.Database.BeginTransaction()
打开该交易。这是建议的方式:MSDN / Working with Transactions (EF6 Onwards) context.Database.ExecuteSqlCommand()
代替context.Database.SqlQuery<T>()
。