我想编写一些 C# 代码来用一些种子数据初始化我的数据库。显然,这将需要能够在插入时设置各种标识列的值。我正在使用代码优先的方法。默认情况下,DbContext
处理数据库连接,因此您不能 SET IDENTITY_INSERT [dbo].[MyTable] ON
。所以,到目前为止,我所做的是使用 DbContext
构造函数,它让我指定要使用的数据库连接。然后,我在该数据库连接中将 IDENTITY_INSERT
设置为 ON
,然后尝试使用 Entity Framework 插入我的记录。这是我到目前为止所获得的示例:
public class MyUserSeeder : IEntitySeeder {
public void InitializeEntities(AssessmentSystemContext context, SqlConnection connection) {
context.MyUsers.Add(new MyUser { MyUserId = 106, ConceptPersonId = 520476, Salutation = "Mrs", Firstname = "Novelette", Surname = "Aldred", Email = null, LoginId = "520476", Password="28c923d21b68fdf129b46de949b9f7e0d03f6ced8e9404066f4f3a75e115147489c9f68195c2128e320ca9018cd711df", IsEnabled = true, SpecialRequirements = null });
try {
connection.Open();
SqlCommand cmd = new SqlCommand("SET IDENTITY_INSERT [dbo].[MyUser] ON", connection);
int retVal = cmd.ExecuteNonQuery();
context.SaveChanges();
}
finally {
connection.Close();
}
}
}
这么近又这么远 - 因为虽然 cmd.ExecuteNonQuery()
工作正常,但当我运行 context.SaveChanges()
时,我被告知“当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表‘MyUser’中的标识列指定显式值。”
据推测,因为 MyUserId(MyUser 表中的身份列)是主键, Entity Framework 在我调用 context.SaveChanges()
时不会尝试设置它,即使我为 MyUser
实体提供了 MyUserId
属性的值。
有没有办法强制 Entity Framework 尝试插入实体的主键值,那么呢?或者可能是暂时将 MyUserId
标记为不是主键值的方法,以便 EF 尝试插入它?
最佳答案
EF 6 方法,使用 msdn article :
using (var dataContext = new DataModelContainer())
using (var transaction = dataContext.Database.BeginTransaction())
{
var user = new User()
{
ID = id,
Name = "John"
};
dataContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] ON");
dataContext.User.Add(user);
dataContext.SaveChanges();
dataContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] OFF");
transaction.Commit();
}
更新:当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,避免错误“必须为表‘TableName’中的标识列指定显式值” ",您应该在模型设计器中将身份列的 StoreGeneratedPattern 属性的值从 Identity 更改为 None。
请注意,将 StoreGeneratedPattern 更改为 None 将无法插入没有指定 ID 的对象(正常方式)并出现错误“当 IDENTITY_INSERT 设置为 OFF 时,无法为表‘TableName’中的标识列插入显式值”。
关于asp.net - 如何强制 Entity Framework 插入标识列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13086006/