Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 实体框架核心:具有持久值的计算列_Sql Server_Entity Framework Core - Fatal编程技术网

Sql server 实体框架核心:具有持久值的计算列

Sql server 实体框架核心:具有持久值的计算列,sql-server,entity-framework-core,Sql Server,Entity Framework Core,我有点惊讶,我没有找到关于以下问题的任何信息,所以如果我在文档中遗漏了它,请原谅。首先使用SQL Server(2016本地和Azure)和EFCore代码,我们尝试创建一个具有持久值的计算表列。创建列可以很好地工作,但我不知道如何保持该值。我们的工作如下: modelBuilder.Entity<SomeClass>(entity => { entity.Property(p => p.Checksum) .HasComputedColumnSq

我有点惊讶,我没有找到关于以下问题的任何信息,所以如果我在文档中遗漏了它,请原谅。首先使用SQL Server(2016本地和Azure)和EFCore代码,我们尝试创建一个具有持久值的计算表列。创建列可以很好地工作,但我不知道如何保持该值。我们的工作如下:

modelBuilder.Entity<SomeClass>(entity =>
{
    entity.Property(p => p.Checksum)
        .HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]))");
});
谁能给我指出正确的方向吗

提前谢谢你,托比

更新:基于@jeroen mostert的一个好主意,我还尝试将
持久化的
字符串作为公式的一部分传递:

modelBuilder.Entity<SomeClass>(entity =>
{
    entity.Property(p => p.Checksum)
        .HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]) PERSISTED)");
});
modelBuilder.Entity(Entity=>
{
entity.Property(p=>p.Checksum)
.HasComputedColumnSql((校验和([FirstColumnName],[SecondColumnName]));
});
括号外:

modelBuilder.Entity<SomeClass>(entity =>
{
    entity.Property(p => p.Checksum)
        .HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName])) PERSISTED");
});
modelBuilder.Entity(Entity=>
{
entity.Property(p=>p.Checksum)
.HasComputedColumnSql(([FirstColumnName],[SecondColumnName])校验和)持久化;
});

然而,令人惊讶的是,计算列仍然是用
is persistend=No
生成的,因此
persistend
字符串似乎被忽略了。

在进行了一些读取和测试之后,我在SQL查询中尝试了持久化,结果成功了

entity.Property(e => e.Duration_ms)
      .HasComputedColumnSql("DATEDIFF(MILLISECOND, 0, duration) PERSISTED");
生成的迁移如下所示:

migrationBuilder.AddColumn<long>(
            name: "duration_ms",
            table: "MyTable",
            nullable: true,
            computedColumnSql: "DATEDIFF(MILLISECOND, 0, duration) PERSISTED");
select is_persisted, name from sys.computed_columns where is_persisted = 1
我创建的列就在那里。

您还可以指定存储一个计算列(有时称为持久列),这意味着它是在每次更新行时计算的,并与常规列一起存储在磁盘上:

modelBuilder.Entity(Entity=>
{
entity.Property(p=>p.Checksum)
.HasComputedColumnSql(([FirstColumnName],[SecondColumnName]),存储:true);
});

这是采取(并略有修改)来自Microsoft文档。

请注意,
校验和
对于大多数用途都是不好的,包括用作散列索引的基础,尽管您可以使用它,因为重复项不太可能对性能有很大影响。如果您要将其用于散列索引,则不需要将其作为散列索引保存如果不是哈希索引,考虑一个更好的校验和算法,使用<代码> hash Bys<代码>。谢谢这些信息。现在我们使用该列来检查在两个不同表中具有匹配ID值的行的差异。,因此我将对此进行研究。然而,最初的问题仍然存在,因为我还想保留计算列,而不考虑校验和算法。冒着说傻话的风险,您是否检查了如果您只是将
持久化的
添加到方法中的定义会发生什么?我怀疑EF是否会进行任何解析或解释g、 它不需要知道列是否被物理持久化(只需要知道它是计算出来的)。这听起来一点也不愚蠢,但不幸的是,它似乎不起作用。“似乎不起作用”以什么方式出现?它是否出错?EF是否不执行现有列的迁移?(如果它将定义视为一个黑匣子,这或多或少是意料之中的。)如果从头开始,它是否会生成计算的列,而不是持久化的列?(这对我来说会很奇怪,因为这意味着EF会解析定义,并特意忽略
持久化的
)谢谢。您使用的是哪个版本的EF Core?@OnkelToob 2.0.1那么它也应该在我的代码中起作用(请参阅我文章的更新部分)。我能发现的唯一区别是:您没有使用任何括号。不幸的是,在此期间我们已经继续,所以我无法再回到这个主题。
select is_persisted, name from sys.computed_columns where is_persisted = 1
modelBuilder.Entity<SomeClass>(entity =>
{
     entity.Property(p => p.Checksum)
    .HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]), stored: true);
});