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"组:
- HasDefaultValueSql
- 有列名
- 有列类型
- HasComputedColumnSql
- 有默认值
然后有"ForSqlServer"的匹配集:
- ForSqlServerHasDefaultValueSql
- ForSqlServerHasColumnName
- ForSqlServerHasColumnType
- ForSqlServerHasComputedColumnSql
- ForSqlServerHasDefaultValue
似乎还有一种额外的 "ForSqlServer" 扩展方法没有 "generic" 对应方法:
- ForSqlServerUseSequenceHiLo
这两组有什么区别,我什么时候使用哪一组?
我想我已经明白了。在 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 表达式是不同的。
Entity Framework 7(Entity Framework核心)在PropertyBuilder
上有两套不同的扩展方法。第一个好像是"generic"组:
- HasDefaultValueSql
- 有列名
- 有列类型
- HasComputedColumnSql
- 有默认值
然后有"ForSqlServer"的匹配集:
- ForSqlServerHasDefaultValueSql
- ForSqlServerHasColumnName
- ForSqlServerHasColumnType
- ForSqlServerHasComputedColumnSql
- ForSqlServerHasDefaultValue
似乎还有一种额外的 "ForSqlServer" 扩展方法没有 "generic" 对应方法:
- ForSqlServerUseSequenceHiLo
这两组有什么区别,我什么时候使用哪一组?
我想我已经明白了。在 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 表达式是不同的。