В чем разница между методами расширения Has и ForSqlServerHas в построителе свойств EF7?

Entity Framework 7 (Entity Framework Core) имеет два разных набора методов расширения для PropertyBuilder. Первый кажется «общим» набором:

  • HasDefaultValueSql
  • HasColumnName
  • HasColumnType
  • HasComputedColumnSql
  • Хасдефолтвалуе

Затем есть соответствующий набор для «ForSqlServer»:

  • Форсклсерверхаасдефаултвалуескл
  • форсклсерверхасколумнаме
  • Форсклсерверхасколумнтипе
  • Форсклсерверхаскомпутедколумнскл
  • Форсклсерверхаасдефаултвалуе

Также кажется, что есть один дополнительный метод расширения «ForSqlServer» без «общего» аналога:

  • Форсклсерверусесеквенсехило

В чем разница между двумя группами и когда какую из них использовать?


person lc.    schedule 21.06.2016    source источник


Ответы (1)


Думаю, я понял это. В EF Core вы можете использовать разных поставщиков (на данный момент SQL Server и SQLite, я полагаю, что таблицы Azure появятся в будущем). Поскольку функциональные возможности этих поставщиков немного различаются, вы можете указать различное поведение для одного и того же свойства в зависимости от используемого поставщика. В истинном духе внедрения зависимостей это позволяет вам настроить один контекст, который не заботится о том, какой провайдер используется, оставляя выбор провайдера контейнеру DI.

Например, у меня есть приложение, которое использует SQL Server в производстве, но запускает базы данных SQLite в памяти для интеграционных тестов. Поскольку SQL немного отличается между ними, я могу создать свойство со значением по умолчанию, которое работает одинаково в обоих:

b.Property(x => x.ValidFrom)
    .IsRequired()
    .HasColumnName("ValidFromDate")
    .ForSqlServerHasDefaultValueSql("getutcdate()")
    .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");

В чем разница между двумя группами и когда какую из них использовать?

  • Используйте "общую" группу, когда поведение/синтаксис является постоянным независимо от поставщика. В приведенном выше примере я использую имя столбца «ValidFromDate» для всех поставщиков.
  • Используйте методы, специфичные для провайдера, когда поведение/синтаксис зависит от провайдера. В приведенном выше примере поведение одинаково, но фактическое выражение SQL отличается для каждого поставщика.
person lc.    schedule 09.08.2016
comment
@Downvoter не хотите просветить меня относительно моего ошибочного понимания или дать свой собственный ответ? - person lc.; 25.07.2018