Onk*_*oob 8 sql-server entity-framework-core
我有点惊讶我没有找到有关以下问题的任何信息,所以如果我在文档中的某个地方错过了它,请原谅。使用 SQL Server(2016 本地和 Azure)和 EFCore Code First,我们尝试创建一个具有持久值的计算表列。创建列工作正常,但我不知道如何保留该值。这就是我们所做的:
modelBuilder.Entity<SomeClass>(entity =>
{
entity.Property(p => p.Checksum)
.HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]))");
});
Run Code Online (Sandbox Code Playgroud)
以下是我们实际上希望在 T-SQL 中获得的内容:
CREATE TABLE [dbo].[SomeClass]
(
[FirstColumnName] [NVARCHAR](10)
, [SecondColumnName] [NVARCHAR](10)
, [Checksum] AS (CHECKSUM([FirstColumnName], [SecondColumnName])) PERSISTED
);
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?
提前致谢,托比
更新:基于@jeroen-mostert 的一个好主意,我还尝试将字符串PERSISTED作为公式的一部分传递:
modelBuilder.Entity<SomeClass>(entity =>
{
entity.Property(p => p.Checksum)
.HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]) PERSISTED)");
});
Run Code Online (Sandbox Code Playgroud)
还有括号外:
modelBuilder.Entity<SomeClass>(entity =>
{
entity.Property(p => p.Checksum)
.HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName])) PERSISTED");
});
Run Code Online (Sandbox Code Playgroud)
然而,令人惊讶的是,计算列仍然是用 生成的Is Persisted = No,因此该PERSISTED字符串似乎被忽略了。
Mét*_*ule 10
从EF Core 5开始,该HasComputedColumnSql方法有一个新的可选参数bool? stored来指定应保留该列:
modelBuilder.Entity<SomeClass>()
.Property(p => p.Checksum)
.HasComputedColumnSql("checksum([FirstColumnName], [SecondColumnName])", stored: true);
Run Code Online (Sandbox Code Playgroud)
在做了一些阅读和一些测试之后,我最终在 SQL 查询中尝试了 PERSISTED 并且它起作用了。
entity.Property(e => e.Duration_ms)
.HasComputedColumnSql("DATEDIFF(MILLISECOND, 0, duration) PERSISTED");
Run Code Online (Sandbox Code Playgroud)
生成的迁移如下:
migrationBuilder.AddColumn<long>(
name: "duration_ms",
table: "MyTable",
nullable: true,
computedColumnSql: "DATEDIFF(MILLISECOND, 0, duration) PERSISTED");
Run Code Online (Sandbox Code Playgroud)
为了检查数据库是否确实持久存在,我运行了以下命令:
select is_persisted, name from sys.computed_columns where is_persisted = 1
Run Code Online (Sandbox Code Playgroud)
我创建的专栏就在那里。
| 归档时间: |
|
| 查看次数: |
8384 次 |
| 最近记录: |