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