EF7属性构建器中的`Has ...`和`ForSqlServerHas ...`扩展方法有什么区别?

时间:2016-06-21 06:25:03

标签: entity-framework-core ef-model-builder

实体框架7(实体框架核心)在PropertyBuilder上有两组不同的扩展方法。第一个似乎是“通用”集:

  • HasDefaultValueSql
  • HasColumnName
  • HasColumnType
  • HasComputedColumnSql
  • HasDefaultValue

然后有一个“ForSqlServer”的匹配集:

  • ForSqlServerHasDefaultValueSql
  • ForSqlServerHasColumnName
  • ForSqlServerHasColumnType
  • ForSqlServerHasComputedColumnSql
  • ForSqlServerHasDefaultValue

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

  • ForSqlServerUseSequenceHiLo

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

1 个答案:

答案 0 :(得分:2)

我想我已经弄明白了。在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表达式都不同。