2015-02-28 2 views
1

У меня есть некоторые данные в моей базе данных EF. Я хочу, чтобы изменить внешний ключ в одном из моих классов:Изменение внешнего ключа: Невозможно вставить значение NULL в столбец

[ForeignKey("Collection")] 
public int CollectionID { get; set; } 

К сожалению, я получаю эту ошибку

Не удается вставить значение NULL в столбце «CollectionID», таблица «WebLanguageTeacher1.dbo.Words» ; столбец не допускает нулей. Ошибка UPDATE.

, когда я пытаюсь добавить новую миграцию в мою базу данных. Это понятно: ключ foregin не может быть пустым, когда я создаю новый столбец в моем db, Entity Framework создает новые ячейки NULL.

Вопрос в следующем: что делать, чтобы обходить его? Как я могу добавить новый внешний ключ, несмотря на это?

+0

Когда вы меняете его в edmx, вы обновили/обновили Entity ..? дайте мне знать, правильно ли я понимаю вашу проблему. – MethodMan

+0

Я использую EF Code First, поэтому я изменяю модель непосредственно в коде, а не в файле edmx. – Piotrek

ответ

0

У меня ранее был аналогичный сценарий, хотя это был первичный ключ в моем случае.

Я передал это путем редактирования сценариев миграции.

+0

Что вы точно изменили? – Piotrek

0

Это не действительно код инфраструктуры Entity. Первая проблема, но проблема с базой данных.

Если вы попытаетесь добавить столбец в таблицу, а затем добавьте ограничение внешнего ключа в таблицу первичного ключа, вы получите ту же ошибку.

Причина в том, что вы создали столбец с нулевым значением по умолчанию для каждой существующей записи. Затем, применяя ограничение, вы будете пытаться связать нуль с основным ключом родительской таблицы.

Таким образом, решение является одним из нескольких вариантов:

Если текущие данные не требуется (начальное развитие приложения), а затем очистить данные - это позволит отношения, которые будут созданы и будут принимать только эффект при добавлении данных.

Установите значение по умолчанию для нового столбца, имеющего существующее значение в родительской таблице, чтобы никакие записи не смогли найти значение родительского ключа. Итак, если вы знаете, что в родительской таблице всегда будет значение «1», вы можете использовать «1» в качестве значения по умолчанию (только временное решение - допустило бы недопустимые данные в будущем для живого приложения).

Создайте столбец без связи, заполните столбец со связанными значениями, а затем добавьте ограничение.

+0

Я не могу удалить эти данные. Я использовал атрибут DeafaultValue, но я все еще получаю эту ошибку. Что я должен использовать для установки значения по умолчанию, если не этот атрибут? – Piotrek

+1

Вам нужно два этапа миграции: 1) добавить новый столбец без ссылочного ограничения и установить его правильное значение (то есть значение, которое будет действительным, если вы добавите ограничение FK позже) для всех существующих записей как часть вашего сценария миграции 2) добавить Ограничение FK. – pf1957

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