EF Core 2.0 提供程序特定的模型配置 [英] EF Core 2.0 provider specific model configuration

查看:16
本文介绍了EF Core 2.0 提供程序特定的模型配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

modelBuilder(b =>{b.Property(x => x.CreateDate).是必须的().ForSqlServerHasDefaultValueSql("getutcdate()").ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");}

这是如何在 2.0 中完成的?

解决方案

我在文档中找不到任何东西(还)但深入挖掘源,commit 747c86556b2a21526973d4626296e2a29:p<块引用>

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

#7166 的一部分

代码可以代替使用

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

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

modelBuilder(b =>{b.Property(x => x.CreateDate).是必须的();如果 (Database.IsSqlServer())b.Property(x => x.CreateDate).HasDefaultValueSql("getutcdate()");如果 (Database.IsSqlite())b.Property(x => x.CreateDate).HasDefaultValueSql("CURRENT_TIMESTAMP");}

<小时>

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

<块引用>

不是使用像 ForSqlServerToTable 这样的方法,而是使用扩展方法现在可以根据当前情况编写条件代码使用中的提供者.例如:

modelBuilder.Entity().ToTable(Database.IsSqlServer() ?"SqlServerName": "其他名称");

I am trying to upgrade an EF Core 1.x project to 2.0. In 1.x I was taking advantage of provider-specific extension methods (e.g. ForSqlServerHasDefaultValueSql/ForSqliteHasDefaultValueSql or ForSqlServerHasColumnType) but these seem to have been removed in 2.0.

Since each provider has its own flavor of SQL and capabilities, I need to be able to use slightly different setups or SQL strings per provider in OnModelCreating. For example to set a default value I might have:

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

How is this done in 2.0?

解决方案

I couldn't find anything in the documentation (yet) but digging deep into the source, there is a comment in the logs of commit 747c86556b2a21526973d462626e299b9bde7b91:

Remove ForSqlServer... ForSqlite... methods for relational concepts

Part of #7166

Code can instead use

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

Therefore the snippet in the question would translate to:

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


Kudos to @IvanStoev for pointing me to the 1.x to 2.0 upgrade documentation. Somehow my Google-fu was failing me today. On this page it clearly shows what to do:

Instead of using methods like ForSqlServerToTable, extension methods are now available to write conditional code based on the current provider in use. For example:

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

这篇关于EF Core 2.0 提供程序特定的模型配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆