代码之家  ›  专栏  ›  技术社区  ›  lc.

EF Core 2.0特定于供应商的模型配置

  •  4
  • lc.  · 技术社区  · 8 年前

    我正在尝试升级EF Core 1。x项目到2.0。在1。x I利用了特定于提供商的扩展方法(例如。 ForSqlServerHasDefaultValueSql / ForSqliteHasDefaultValueSql ForSqlServerHasColumnType )但这些似乎在2.0中被删除了。

    OnModelCreating . 例如,要设置默认值,我可能需要:

    modelBuilder<Foo>(b =>
    {
        b.Property(x => x.CreateDate)
            .IsRequired()
            .ForSqlServerHasDefaultValueSql("getutcdate()")
            .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");
    }
    

    1 回复  |  直到 8 年前
        1
  •  11
  •   lc.    8 年前

    我在文档中找不到任何东西,但深入挖掘源代码,在的日志中有一条评论 commit 747c86556b2a21526973d462626e299b9bde7b91 :

    删除ForSqlServer。。。ForSqlite。。。关系概念的方法

    代码可以使用

    if (Database.IsSqlServer())
    {
        modelBuilder.HasColumnName("MySqlServerName");
    }
    

    因此,问题中的片段将翻译为:

    modelBuilder<Foo>(b =>
    {
        b.Property(x => x.CreateDate)
            .IsRequired();
    
        if (Database.IsSqlServer())
            b.Property(x => x.CreateDate).HasDefaultValueSql("getutcdate()");
    
        if (Database.IsSqlite())
            b.Property(x => x.CreateDate).HasDefaultValueSql("CURRENT_TIMESTAMP");
    }
    

    感谢@IvanStoev指点我 the 1.x to 2.0 upgrade documentation

    而不是使用以下方法 ForSqlServerToTable ,扩展方法 现在可以基于当前

    modelBuilder.Entity<User>().ToTable(
        Database.IsSqlServer() ? "SqlServerName" : "OtherName");
    
    推荐文章