EF Core 2.0 提供商特定模型配置
EF Core 2.0 provider specific model configuration
我正在尝试将 EF Core 1.x 项目升级到 2.0。在 1.x 中,我利用了特定于提供者的扩展方法(例如 ForSqlServerHasDefaultValueSql
/ForSqliteHasDefaultValueSql
或 ForSqlServerHasColumnType
),但这些似乎已在 2.0 中被删除。
由于每个提供商都有自己的 SQL 风格和功能,我需要能够在 OnModelCreating
中为每个提供商使用略有不同的设置或 SQL 个字符串。例如设置一个默认值我可能有:
modelBuilder<Foo>(b =>
{
b.Property(x => x.CreateDate)
.IsRequired()
.ForSqlServerHasDefaultValueSql("getutcdate()")
.ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");
}
这在 2.0 中是如何完成的?
我(还)在文档中找不到任何内容,但深入挖掘源代码,commit 747c86556b2a21526973d462626e299b9bde7b91 的日志中有一条评论:
Remove ForSqlServer... ForSqlite... methods for relational concepts
Part of #7166
Code can instead use
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。不知何故,我的 Google-fu 今天让我失望了。在此页面上,它清楚地显示了要做什么:
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 1.x 项目升级到 2.0。在 1.x 中,我利用了特定于提供者的扩展方法(例如 ForSqlServerHasDefaultValueSql
/ForSqliteHasDefaultValueSql
或 ForSqlServerHasColumnType
),但这些似乎已在 2.0 中被删除。
由于每个提供商都有自己的 SQL 风格和功能,我需要能够在 OnModelCreating
中为每个提供商使用略有不同的设置或 SQL 个字符串。例如设置一个默认值我可能有:
modelBuilder<Foo>(b =>
{
b.Property(x => x.CreateDate)
.IsRequired()
.ForSqlServerHasDefaultValueSql("getutcdate()")
.ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");
}
这在 2.0 中是如何完成的?
我(还)在文档中找不到任何内容,但深入挖掘源代码,commit 747c86556b2a21526973d462626e299b9bde7b91 的日志中有一条评论:
Remove ForSqlServer... ForSqlite... methods for relational concepts
Part of #7166
Code can instead use
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。不知何故,我的 Google-fu 今天让我失望了。在此页面上,它清楚地显示了要做什么:
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");