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

What is the difference between the `Has...` and `ForSqlServerHas...` extension methods in EF7 property builder?

Entity Framework 7(Entity Framework核心)在PropertyBuilder上有两套不同的扩展方法。第一个好像是"generic"组:

然后有"ForSqlServer"的匹配集:

似乎还有一种额外的 "ForSqlServer" 扩展方法没有 "generic" 对应方法:

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

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

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

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

What is the difference between the two groups and when do I use which one?

  • 当 behavior/syntax 与提供商无关时,使用 "generic" 组。在上面的示例中,我为所有提供者使用列名 "ValidFromDate"。
  • 当 behavior/syntax 取决于提供商时,使用特定于提供商的方法。在上面的示例中,行为是相同的,但每个提供者的实际 SQL 表达式是不同的。