2013-09-10 2 views
3

Я пишу приложение, которое экспортирует данные и сериализует их в файл для архивирования старых данных.Entity Framework и Identity Insert

Бывают случаи, когда по какой-либо причине необходимо повторно импортировать данные. Это вызвало у меня проблему из-за столбца идентификации.

Чтобы обойти это, я выполняю работу внутри области транзакции. Установка идентификатора Вставка Вкл. Для этой таблицы, а затем обновление моей транзакции, например.

using (TR.TransactionScope scope = new TR.TransactionScope(TR.TransactionScopeOption.RequiresNew)) 
       { 
        // allow transaction nbr to be inserted instead of auto generated       
        int i = context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.Transactions ON"); 

        try 
        { 
         // check if it already exists before restoring 
         var matches = context.Transactions.Where(tr => tr.transaction_nbr == t.transaction_nbr); 

         if (matches.Count() == 0) 
         { 
          Transaction original = t;         
          context.Transactions.AddObject(original); 
          context.SaveChanges(); 
          restoreCount++; 

Но я получаю исключение, говоря:

Явное должно быть указано значение для столбца идентификаторов в таблице либо при IDENTITY_INSERT> установлен в положение ON или когда пользователь репликации вставив в NOT FOR REPLICATION identity> column.

Я предполагаю, что структура сущности пытается сделать какую-либо вставку блока без указания столбцов. Есть ли все равно сделать это в инфраструктуре сущности.

Объект большой и имеет ряд связанных объектов, которые также десериализуются и нуждаются в вставке, поэтому я хочу, чтобы инфраструктура сущности делала это, если это было возможно, поскольку это сэкономит мне много дополнительной работы.

Любая помощь приветствуется.

+0

Я не знаю, что я сделал, но он, по-видимому, исправился. – PaulMcCaffery

+0

Либо я каким-то образом изменил модель, чтобы ее можно было, или, возможно, были некоторые проблемы, связанные с определением области охвата, что означало, что он не мог повторно импортировать из-за некоторого похмелья из предыдущего экспорта. – PaulMcCaffery

+0

Nah, обратно. Что, черт возьми, я делаю? – PaulMcCaffery

ответ

3

Герт Арнольд - это был ответ на мой вопрос. Спасибо.

Я прочитал это в другом месте и установил значение в браузере объектов, поэтому подумал, что этого достаточно. Я также дважды проверил значение, щелкнув правой кнопкой мыши .edmx и Open With, чтобы увидеть подробности в редакторе XML, как это предлагается в другом сообщении.

Когда я проверил значение в редакторе XML, изначально он тоже был «Нет», так что это не было моей проблемой. Но я предполагаю, что просто собираюсь туда и сэкономить исправленную проблему в первый раз.

Во второй раз после того, как я, должно быть, обновил модель из базы данных, мне пришлось повторить этот шаг по вашему предложению. Но во второй раз StoreGeneratorPattern отличался от того, который был установлен в обозревателе объектов, поэтому мне нужно было вручную изменить его в XML.

В моих обстоятельствах это нормально, так как обычно записи вставляются через другой механизм, поэтому идентификация только мешает мне, поскольку идентификатор всегда будет вставлен как старое (используемое для существования) значение идентичности, которое временно восстановлен.

Благодарим за помощь.

+0

Или, если вы используете Code First, добавьте [DatabaseGenerated (DatabaseGeneratedOption.None)] как атрибут свойства первичного ключа. –

Смежные вопросы