我正在尝试将记录插入带有标识主键的表中。有时候,我需要设置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'中为identity列插入显式值。
(SQL Profiler显示每个'action'都是它自己的'batch')
(另一个帖子仍然使用ExecuteStoreCommand
来打开和关闭身份插页,但这似乎在EF5中消失了。)
我已关闭连接字符串中的连接池,但仍然没有快乐。任何想法如何使这项工作?或者还有另一种方法 - 最佳实践 - 来做到这一点吗?
答案 0 :(得分:1)
出现此问题,因为您需要告诉EF Key列(Id)不应该是数据库生成的。
[DatabaseGenerated(DatabaseGenerationOption.None)]
或通过modelBuilder:
Property(obj => obj.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
.HasColumnName("Id");