EF Не удается вставить явное значение для столбца идентификаторов в таблицу «X», если для параметра IDENTITY_INSERT установлено значение OFF.

Мне нужно перенести данные из одной базы данных в другую. Ключи должны быть сохранены. Я использую EF с автоматически сгенерированным файлом .dbmx. Я прочитал много ответов на подобную проблему и следую этим предложениям: я включаю IDENTITY_INSERT непосредственно перед вставкой записи; на диаграмме базы данных я изменил StoreGeneratedPattern на None в столбце Id (также пытался сделать то же самое, добавив соответствующий атрибут в свойство Id).

Вот мой код:

var myEntity = new MyTable
{
    Id = 12345,
    Name = "Lorem ipsum",
    BrandId = brandId,      
};

MyContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT MY_TABLE_NAME ON");
MyContext.MyTable.Add(myEntity);
await MyContext.SaveChangesAsync(); //getting error here

Когда это делается в Management Studio, все работает нормально. Проблема появляется только при использовании Entity Framework.

Что выглядит странно, что я вижу в SQL Server Profiler, что команда INSERT_IDENTITY выполняется, а вставка SQL идет со столбцом Id, но, похоже, не выполняется. Когда я копирую и вставляю этот SQL-запрос, он работает нормально.


person mykhailovskyi    schedule 25.11.2018    source источник


Ответы (1)


Проблема в том, что файлы EDMX и Designer.cs генерируются до компиляции, когда вы генерируете схему из БД и не меняете. Проверка выполняется против тех, что находятся в этих файлах. Они ожидают, что свойство identity_insert будет включено, поэтому, когда вы программно отключаете его в БД, уровень EF выдает исключение, с которым вы столкнулись. По сути говоря - ваша БД не соответствует моей.

Честно говоря, такая передача данных больших таблиц — это не то, для чего предназначен EF. Вы должны использовать Массовое копирование данных

person Matt    schedule 25.11.2018
comment
спасибо за быстрый ответ. Отчасти это правда, что вы сказали. Но я изменил поведение диаграммы EDMX для столбца Id. - person mykhailovskyi; 25.11.2018