【问题标题】:EF Core 2.0 provider specific model configurationEF Core 2.0 提供程序特定模型配置
【发布时间】:2017-09-07 14:33:38
【问题描述】:

我正在尝试将 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 中是如何做到的?

【问题讨论】:

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


    【解决方案1】:

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

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

    #7166 的一部分

    代码可以改为使用

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

    因此问题中的 sn-p 将转换为:

    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。不知何故,我的 Google-fu 今天让我失望了。在此页面上,它清楚地显示了要做什么:

    不使用ForSqlServerToTable 之类的方法,而是使用扩展方法 现在可用于编写基于当前的条件代码 使用中的提供者。例如:

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

    【讨论】:

    猜你喜欢
    • 2020-04-22
    • 2019-11-12
    • 2022-08-02
    • 2011-12-26
    • 2020-06-16
    • 1970-01-01
    • 2020-04-19
    • 2018-05-01
    • 2021-03-29
    相关资源
    最近更新 更多