EF7屬性構建器中的`Has ...`和`ForSqlServerHas ...`擴展方法有什麼區別?

ef-model-builder entity-framework-core

實體框架7(實體框架核心)在PropertyBuilder上有兩組不同的擴展方法。第一個似乎是“通用”集:

  • HasDefaultValueSql
  • HasColumnName
  • HasColumnType
  • HasComputedColumnSql
  • HasDefaultValue

然後是“ForSqlServer”的匹配集:

  • ForSqlServerHasDefaultValueSql
  • ForSqlServerHasColumnName
  • ForSqlServerHasColumnType
  • ForSqlServerHasComputedColumnSql
  • ForSqlServerHasDefaultValue

似乎還有一個額外的“ForSqlServer”擴展方法,沒有“通用”對應方式:

  • ForSqlServerUseSequenceHiLo

兩組之間有什麼區別?我什麼時候使用哪一組?

一般承認的答案

我想我已經弄明白了。在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表達式是不同的。


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow