entity-framework-core - EF7 属性生成器中的 `Has...` 和 `ForSqlServerHas...` 扩展方法有什么区别?

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

Entity Framework 7 (Entity Framework Core) 在 PropertyBuilder 上有两组不同的扩展方法.第一个似乎是“通用”集:

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

  • 然后是“ForSqlServer”的匹配集:
  • ForSqlServerHasDefaultValueSql
  • ForSqlServerHasColumnName
  • ForSqlServerHasColumnType
  • ForSqlServerHasComputedColumnSql
  • ForSqlServerHasDefaultValue

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

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

    最佳答案

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

    例如,我有一个应用程序在生产中使用 SQL Server,但启动 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?


  • 当行为/语法不变时,无论提供者如何,都使用“通用”组。在上面的示例中,我为所有提供者使用列名“ValidFromDate”。
  • 当行为/语法取决于提供者时,使用提供者特定的方法。在上面的示例中,行为相同,但每个提供程序的实际 SQL 表达式不同。
  • 关于entity-framework-core - EF7 属性生成器中的 `Has...` 和 `ForSqlServerHas...` 扩展方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37936956/

    相关文章:

    c# - Entity Framework 多重级联删除

    c# - 无法跟踪实体类型 'Item' 的实例,因为已跟踪具有相同键值 {'Id' } 的另一个实例

    azure - 在使用 GitHub 部署的 azure for dotnet core 站点上运行迁移

    c# - ASP.NET MVC + EF脚手架实现EntityTypeConfiguration类后可以使用吗?

    c# - EF核心: Using ID as Primary key and foreign key at same time

    entity-framework-core - EF Core 2.0 提供程序特定的模型配置

    sql - EF 迁移正在删除列并尝试将不存在的列重命名回 Id

    asp.net-core - 如何在 Entity Framework Core 中创建与同一实体的两个一对一关系

    entity-framework - ASP.NET vNext MVC 和 Entity Framework 问题

    c# - 在 Entity Framework Core 中使用 Npgsql.NodaTime