gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:24:29 27 4
gpt4 key购买 nike

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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com