2

我正在尝试将记录插入具有标识主键的表中。有时,我需要设置pk。例如,在创建已知测试数据以进行可靠的集成测试或在隔离环境中调试生产问题时,这可能很有用。

其他帖子说要执行一条sql语句:

private void IdentityInsertOK()
    {
        var sql = "set identity_insert  ConfigSettings on " +
                   "delete from ConfigSettings where id =2 " +
                  "insert into ConfigSettings (Id,Name, value) values (2,'test ','testval')  " +
                  "set identity_insert  ConfigSettings off ";
        using (var Db = SettingsHelper.CreateContext(ConnectionType.Syrius))
        {
            Db.Database.ExecuteSqlCommand(sql);
            Db.SaveChanges();
        }

    }

虽然 SQL 插入语句有效,但它破坏了实体框架的提议/好处。(特别是防止SQL注入)。

我尝试了以下方法,但失败了context.SaveChanges

private static void InsertEmployee(EmployeeModel employee)
{
        var emp = new Employee //The database employee record 
            {
                EmployeeId = emp.EmployeeId,
                FirstName = emp.FirstName,
                ...
            };

        using (var context = new EmployeeEntities())
        {
            try
            {
                context.Database.Connection.Open();

                using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Employee ON");
                    context.Employees.Add(emp);
                    context.SaveChanges();
                    context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Employee OFF");
                    scope.Complete();
                }
            }
            finally
            {
                context.Database.Connection.Close();
            }
        }
    }

获取数据库错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Employee' 中插入标识列的显式值。

(SQL Profiler 显示每个“动作”都是它自己的“批次”)

(另一个帖子ExecuteStoreCommand用于打开和关闭身份插入,但这似乎在 EF5 中消失了。)

我已经关闭了连接字符串中的连接池,但仍然没有乐趣。任何想法如何使这项工作?还是有另一种方法 - 最佳实践 - 来做到这一点?

4

1 回答 1

1

出现这个问题,是因为需要告诉 EF Key 列 (Id) 不应该是数据库生成的。

[DatabaseGenerated(DatabaseGenerationOption.None)]

或通过模型构建器:

Property(obj => obj.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
    .HasColumnName("Id");
于 2016-11-28T10:59:55.037 回答