EF Core 2.0提供程序特定的模型配置

时间:2017-09-07 06:07:47

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

我正在尝试将EF Core 1.x项目升级到2.0。在1.x中,我使用了特定于提供程序的扩展方法(例如ForSqlServerHasDefaultValueSql / ForSqliteHasDefaultValueSqlForSqlServerHasColumnType),但这些方法似乎已在2.0中删除。

由于每个提供程序都有自己的SQL和功能,我需要能够在OnModelCreating中为每个提供程序使用略有不同的设置或SQL字符串。例如,要设置我可能具有的默认值:

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

如何在2.0中完成?

1 个答案:

答案 0 :(得分:2)

我无法在文档中找到任何内容(但是)但深入挖掘源代码,commit 747c86556b2a21526973d462626e299b9bde7b91的日志中有一条评论:

  

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

     

#7166的一部分

     

代码可以改为使用

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");