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

5
我正在尝试将一个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个回答

12

虽然我在文档中找不到相关信息,但深入查看源代码后,发现在提交 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指引我到1.x升级到2.0的文档。今天我的Google-fu似乎失灵了。该页面清楚地展示了应该做什么:

现在可以使用扩展方法来编写基于当前提供程序的条件代码,而不是使用ForSqlServerToTable等方法。例如:

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

3
这里是一个链接,指向从以前的版本升级到EF Core 2.0的主题,其中包含(某种程度上的)文档 - EF Core关系元数据API更改 - Ivan Stoev
@IvanStoev 那就是我希望存在的页面。谢谢! - lc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接