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