Все, що можна налаштувати за допомогою DataAnnotations, також можливо за допомогою API Fluent. Зворотний неправда. Отже, з точки зору параметрів конфігурації та гнучкості API Fluent є "кращим".
Приклади конфігурації (точно не повний перелік), які можливі в Fluent API, але не з DataAnnotations (наскільки я бачу):
Вимкнення каскадних видалень:
.WillCascadeOnDelete(false)
Укажіть ім'я стовпця з іноземним ключем у базі даних, коли ключ не відкритий у вашій об'єктній моделі:
.Map(conf => conf.MapKey("MyForeignKeyID"))
Тонка деталізація відносин, особливо у всіх випадках, коли в об'єктній моделі виставляється лише одна сторона асоціації:
.WithMany(...)
, WithOptional(...)
, WithRequiredDependent(...)
,WithRequiredPrincipal(...)
Специфікація відображення спадщини між об'єктною моделлю та таблицями баз даних (Таблиця-за-ієрархією, Таблиця-на-тип, Таблиця-за-конкретним-класом):
.Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)
Редагувати: Microsoft розглядає API Fluent як "розширену функцію" (цитата звідси ):
Вільний API вважається більш вдосконаленою функцією, і ми рекомендуємо використовувати Анотації даних, якщо ваші вимоги не вимагають використання поточного API.
Але, на мою думку, ви дуже швидко досягаєте обмежень DataAnnotations (за винятком, можливо, надзвичайно простих об'єктних моделей). Якщо ви більше не можете налаштувати свою модель за допомогою DataAnnotations, останньою можливістю є дотримуватися стандартних стандартів зіставлення карт (називаючи свої властивості відповідно до цих правил). В даний час ви не можете перезаписати конвенції (лише відключіть їх; MS оголосив про надання параметрів конфігурації для конвенцій у майбутніх випусках EF). Але якщо ви не хочете, щоб примусово домовлятися про умови відображення під час визначення вашої об'єктної моделі, єдиний варіант - API Fluent.
Навчання API Fluent - це майже обов'язково, DataAnnotations - це приємно мати прості програми.