Code First - лучше ли использовать аннотации данных или Fluent API?

Просто интересно, что лучше всего настроить мою модель?

Мне нравится API Fluent, потому что тогда мой POCO не заполнен специфическими атрибутами EF.

Есть ли что-то, что вы не можете сделать с API Fluent, который вы можете использовать с атрибутами?

Ответ 1

Все, что вы можете настроить с помощью DataAnnotations, также возможно с Fluent API. Обратное неверно. Таким образом, с точки зрения параметров конфигурации и гибкости Fluent API "лучше".

Примеры конфигурации (наверняка, не полный список), которые возможны в Fluent API, но не с DataAnnotations (насколько я могу видеть):

  • Отключить каскадные удаления:

    .WillCascadeOnDelete(false)

  • Укажите имя столбца внешнего ключа в базе данных, когда ключ не отображается в вашей объектной модели:

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • Точная гранулированная настройка отношений, особенно во всех случаях, когда в объектной модели отображается только одна сторона ассоциации:

    .WithMany(...), WithOptional(...), WithRequiredDependent(...), WithRequiredPrincipal(...)

  • Спецификация сопоставления наследования между объектной моделью и таблицами базы данных (Table-Per-Hierarchy, Table-Per-Type, Table-Per-Concrete-Class):

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

Изменить: Microsoft рассматривает Fluent API как "расширенную функцию" (цитата из здесь):

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

Но, на мой взгляд, вы очень быстро достигаете ограничений DataAnnotations (за исключением, возможно, для чрезвычайно простых объектных моделей). Если вы не можете точно настроить свою модель с помощью DataAnnotations, последнее, что вам нужно, это следовать правилам сопоставления по умолчанию (путем присвоения имен вашим свойствам в соответствии с этими правилами). В настоящее время вы не можете перезаписывать соглашения (только их отключить, MS объявила, что предоставляет варианты конфигурации для конвенций в будущих выпусках EF). Но если вы не хотите, чтобы вас принуждали к соглашениям о сопоставлении, когда вы определяете свою объектную модель, единственным вариантом является Fluent API.

Изучение Fluent API - это почти Must imho, DataAnnotations - приятный для простых приложений.