2013-03-07 3 views
2

У меня есть код-первая модель Entity Framework, в которой Поставщик должен всегда иметь SupplierGroup:Карты обязательного поля для NULLABLE в базе данных

public virtual SupplierGroup SupplierGroup { get; set; } 
    public int SupplierGroupId { get; set; } 

Но основную базу данных должны иметь SupplierGroupId в обнуляемом (из-за другие используя его, в котором Поставщик может существовать без Группы поставщиков).

Есть ли способ заставить Entity Framework генерировать/сопоставлять нулевое поле базы данных, но в противном случае продолжать обрабатывать поле в модели по мере необходимости?

Я попытался бегло отображение:

modelBuilder.Entity<Supplier>() 
    .Property(s => s.SupplierGroupId) 
    .IsOptional(); 

Но когда код-первых генерироваться базы данных, поле было еще не обнуляемым.

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

+1

Сверху моей головы вы пробовали 'public int? SupplierGroupId {get; задавать; } '? –

+0

@Sameer Это то, чего я пытаюсь избежать. Я хочу, чтобы модель думала, что у нее есть поле, отличное от нуля, но база данных действительно имеет значение с нулевым значением. – Appetere

+0

Итак, вы хотите, чтобы ваша модель обрабатывала нулевой столбец базы данных как недействительный? Я не использовал EF через некоторое время, но то, что у вас есть в вашем вопросе, должно быть достаточно. Вы можете попробовать добавить атрибут '[Обязательный]' к свойству 'SupplierGroupId'. –

ответ

2

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

  1. Написать пользовательские базы данных инициализатора, который выполняет сценарий SQL, который изменяет столбец из не-обнуляемых в обнуляемый колонке

  2. Не создать базу данных с Entity Framework, но вручную вместо (путем установки базы данных инициализатору к null, например), имеющему обнуляемой колонне и не-обнуляемую недвижимость

  3. Лечить ваше требование в качестве приложения конкретного бизнеса-логики, которая не отражены в базе данных (и не может быть потому, что другие приложения, обращающиеся к БД есть требование, чтобы позволить NULL с), то есть сделать свойство int? и обеспечить в своем приложении null никогда не используются

Для опции 1 и 2 ваша модель «не синхронизирована» с базой данных, которая будет означать, что вы получите исключения при загрузке Supplier из базы данных, SupplierGroupId - NULL (возможно, что-то вроде «... не может сохранить материализованное значение NULL в не-nullable свойство ... ").

Я бы выбрал вариант 3.

+0

Ты избил меня. :) Я бы также предложил вариант №3. –

+0

Спасибо Слауме. Я пошел с вариантом 3 - в конце концов, было бы неправильно пытаться обмануть модель, что базовая база данных была другой (не говоря уже о том, что, возможно, запутался следующий разработчик, который работает над кодом). Цените ответ. – Appetere

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