【发布时间】:2020-04-22 10:17:06
【问题描述】:
我正在尝试将我的DbContext 与多个提供商一起使用。到目前为止一切正常,除非使用HasDefaultValueSql()。
我想要做的是在dbContext 上添加(和保存)具有当前时间的属性AuditTimestamp。这可以使用适用于 SQL Server 提供程序的类似方法轻松完成
modelBuilder
.Entity(entityType.ClrType)
.Property(nameof(AuditBase.AuditTimestamp))
.HasDefaultValueSql("SYSUTCDATETIME()");
但是当尝试将相同的dbContext 与 SqLite 提供程序一起使用时,它不起作用,因为 SYSUTCDATETIME 在 Sqlite 中不是有效的 SQL 函数。
基于this question我尝试做
modelBuilder
.Entity(entityType.ClrType)
.Property(nameof(AuditBase.AuditTimestamp))
.HasDefaultValueSql(Database.IsSqlite() ? "DATETIME('now')" : "SYSUTCDATETIME()");
但它会在迁移中生成这个
b.Property<DateTime>("AuditTimestamp")
.ValueGeneratedOnAdd()
.HasDefaultValueSql("SYSUTCDATETIME()");
因为我在生成迁移时使用了 SQL Server 连接字符串。这意味着我需要根据我使用的提供程序进行不同的迁移集,这不应该是这种情况。
基于this question,可以在迁移文件中包含提供程序特定的配置,但该示例基于自动生成的 Id 列,我不知道如何将其应用于HasDefaultValueSql()
来自here 我发现这可能有效
HasDefaultValueSql("CURRENT_TIMESTAMP")
但是,当您有两个(或更多)不共享相同 SQL 函数名称的提供程序时,我想要一个更通用的解决方案。
我使用的提供程序是用于生产的 SQL Server 和用于单元测试的 SqlLite。 EF Core 是 2.2 版
【问题讨论】:
-
这是 EF Core 设计者的愿景 - Migrations with Multiple Providers
-
@IvanStoev,您能否给出解释如何使用链接中的注释的答案?
-
CURRENT_TIMESTAMP 和 SYSUTCDATETIME 提供相同的值吗?