我想编写一些 C# 代码来用一些种子数据初始化我的数据库。显然,这将需要能够在插入时设置各种标识列的值。我正在使用代码优先的方法。默认情况下,DbContext
处理数据库连接,因此您不能SET IDENTITY_INSERT [dbo].[MyTable] ON
. 所以,到目前为止我所做的是使用DbContext
让我指定要使用的数据库连接的构造函数。然后,我设置IDENTITY_INSERT
为该ON
数据库连接,然后尝试使用实体框架插入我的记录。这是我到目前为止的一个例子:
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 或复制用户时,必须为表 'MyUser' 中的标识列指定显式值插入到 NOT FOR REPLICATION 标识列中。”
据推测,因为 MyUserId(即 MyUser 表中的 Identity 列)是主键,所以实体框架在我调用时不会尝试设置它context.SaveChanges()
,即使我为MyUser
实体提供了MyUserId
属性值。
那么有没有办法强制实体框架尝试插入实体的主键值呢?或者可能是一种临时标记MyUserId
为不是主键值的方法,所以 EF 尝试插入它?