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

lc.*_*lc. 4 entity-framework-core ef-model-builder

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

由于每个提供程序都有自己的 SQL 风格和功能,因此我需要能够在OnModelCreating. 例如设置一个默认值我可能有:

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

这是如何在 2.0 中完成的?

lc.*_*lc. 9

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

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

#7166 的一部分

代码可以改为使用

if (Database.IsSqlServer())
{
    modelBuilder.HasColumnName("MySqlServerName");
}
Run Code Online (Sandbox Code Playgroud)

因此,问题中的片段将转换为:

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");
}
Run Code Online (Sandbox Code Playgroud)

感谢@IvanStoev 将我指向1.x 到 2.0 升级文档。不知何故,我的 Google-fu 今天让我失望了。在此页面上,它清楚地显示了要做什么:

ForSqlServerToTable现在可以使用扩展方法而不是使用诸如 之类的方法来根据当前使用的提供程序编写条件代码。例如:

modelBuilder.Entity<User>().ToTable(
    Database.IsSqlServer() ? "SqlServerName" : "OtherName");
Run Code Online (Sandbox Code Playgroud)

  • 这是(某种)文档的链接 - **EF Core 关系元数据 API 更改** 主题来自 [将应用程序从以前的版本升级到 EF Core 2.0](https://docs.microsoft.com/en-us/ ef/核心/杂项/1x-2x-升级) (3认同)