实体框架7(实体框架核心)在PropertyBuilder
上有两组不同的扩展方法。第一个似乎是“通用”集:
然后有一个“ForSqlServer”的匹配集:
似乎还有一个额外的“ForSqlServer”扩展方法没有“通用”对应物:
两组之间有什么区别?我何时使用哪一组?
答案 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");
两组之间有什么区别?我何时使用哪一组?