我正在尝试将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中完成?
答案 0 :(得分:2)
我无法在文档中找到任何内容(但是)但深入挖掘源代码,commit 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指点我the 1.x to 2.0 upgrade documentation。不知何故,我的谷歌今天失败了。在此页面上,它清楚地显示了该做什么:
而不是使用像
ForSqlServerToTable
这样的方法,扩展方法 现在可以根据当前值编写条件代码 使用中的提供者。例如:modelBuilder.Entity<User>().ToTable( Database.IsSqlServer() ? "SqlServerName" : "OtherName");