Entity Framework Core:具有持久值的计算列

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)


Dan*_* S. 5

在做了一些阅读和一些测试之后,我最终在 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)

我创建的专栏就在那里。