Я использую Entity Framework 4.1 Code First, и у меня есть таблица с ключом IDENTITY, потому что все новые записи в этой таблице должны иметь автоматически генерируемый ID (столбец ID называется AccountNumber). Мне нужно импортировать некоторые данные из предыдущей инкарнации этой системы - эти номера счетов должны быть сохранены.
В предыдущем вопросе я узнал, что мне нужно SET IDENTITY_INSERT ON, чтобы сохранить старые номера счетов. Идея заключается в том, что при импорте старых клиентов я собираюсь включить IDENTITY_INSERT ON, запустить необработанный SQL-оператор вставки, затем выключить его и продолжить работу в обычном режиме, используя сущности EF.
Итак, у меня есть следующий код:
public const string InsertQuery = "INSERT INTO dbo.Businesses (AccountNumber, Name, Active, CreatedBy, CreatedOn, ModifiedBy, ModifiedOn) VALUES({0}, {1}, {2}, {3}, {4}, {5}, {6})";
...
dbContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Businesses ON");
dbContext.Database.ExecuteSqlCommand(InsertQuery, customerData.AccountNumber, customerData.Name, customerData.Active,
m_userContextManager.GetCurrentUserName(), Now,
m_userContextManager.GetCurrentUserName(), Now);
dbContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Businesses OFF");
// load the entity and map the rest of the attributes
dbContext.SaveChanges();
Когда я перехожу к выполнению второго оператора, я получаю следующую ужасающую ошибку (потому что я только что установил значение OFF или так я думаю):
Cannot insert explicit value for identity column in table 'Businesses' when IDENTITY_INSERT is set to OFF.
Возвращаемое значение оператора -1, но поскольку документация на MSDN по ExecuteSqlCommand очень неадекватна, я понятия не имею, что это значит. Я бы ожидал, что будет выбрасываться исключение, если оператор по какой-то причине не выполнился. Кто-нибудь знает, что здесь происходит?