Я хочу написать код С# для инициализации моей базы данных некоторыми семенными данными. Очевидно, что это потребует способности устанавливать значения различных столбцов Identity при вставке. Я использую подход, основанный на кодах. По умолчанию DbContext
обрабатывает соединение с базой данных, поэтому вы не можете SET IDENTITY_INSERT [dbo].[MyTable] ON
. Итак, что я сделал до сих пор, это использовать конструктор DbContext
, который позволяет мне указать используемое соединение БД. Затем я установил IDENTITY_INSERT
в ON
в этом соединении DB, а затем попытаюсь вставить мои записи, используя сущность 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()
, мне сообщают, что "Явное значение должно быть указано для столбца идентификации в таблице" MyUser ", когда IDENTITY_INSERT установите значение ON или когда пользователь репликации вставлен в столбец идентификации NOT FOR REPLICATION."
Предположительно, поскольку MyUserId (который является столбцом Identity в таблице MyUser) является первичным ключом, инфраструктура сущности не пытается установить его, когда я вызываю context.SaveChanges()
, хотя я дал объекту MyUser
значение для свойства MyUserId
.
Есть ли способ заставить сущность-структуру попробовать и вставить даже значения первичного ключа для объекта? Или, может быть, способ временно маркировать MyUserId
как не значение первичного ключа, поэтому EF пытается его вставить?