4

Entity Framework 7(Entity Framework Core)在PropertyBuilder. 第一个似乎是“通用”集:

  • HasDefaultValueSql
  • 有列名
  • HasColumnType
  • HasComputedColumnSql
  • 有默认值

然后是“ForSqlServer”的匹配集:

  • ForSqlServerHasDefaultValueSql
  • ForSqlServerHasColumnName
  • ForSqlServerHasColumnType
  • ForSqlServerHasComputedColumnSql
  • ForSqlServerHasDefaultValue

似乎还有一种额外的“ForSqlServer”扩展方法没有“通用”对应物:

  • ForSqlServerUseSequenceHiLo

两组之间有什么区别,我什么时候使用哪一组?

4

1 回答 1

4

我想我已经想通了。在 EF Core 中,您可以使用不同的提供程序(目前是 SQL Server 和 SQLite,我相信 Azure Tables 将来会出现)。由于这些提供程序的功能略有不同,您可以根据所使用的提供程序为同一属性指定不同的行为。本着依赖注入的真正精神,这允许您设置一个不关心使用哪个提供者的上下文 - 将提供者的选择留给 DI 容器。

例如,我有一个应用程序在生产中使用 SQL Server,但启动 SQLite 内存数据库以进行集成测试。由于两者之间的 SQL 略有不同,我可以创建一个具有默认值的属性,该属性在两者中的工作方式类似:

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

两组之间有什么区别,我什么时候使用哪一组?

  • 当行为/语法不变时,无论提供者如何,都使用“通用”组。在上面的示例中,我为所有提供者使用列名“ValidFromDate”。
  • 当行为/语法取决于提供者时,使用提供者特定的方法。在上面的示例中,行为相同,但每个提供程序的实际 SQL 表达式不同。
于 2016-08-09T08:15:08.213 回答