如何在Entity Framework中的计算列上创建非聚集索引?

时间:2019-04-24 09:48:35

标签: c# entity-framework

我正在计算另一列中的一列的值,因此需要在计算出的列上创建非聚集索引。

当我尝试使用Entity Framework在计算列上指定索引时,系统会引发异常

  

Microsoft.EntityFrameworkCore.Relational.dll中发生类型为'System.Data.SqlClient.SqlException'的异常,但未在用户代码中处理

     

其他信息:无法在表“ ProdBarCode”上创建过滤索引“ UK_ProdBarCode_BarCodeNumber”,因为过滤器表达式中的“ BarCodeNumber”列是计算列。重写过滤器表达式,使其不包含此列。

prodbarcode.Property<long>(ProdBarCode => 
       ProdBarCode.BarCodeNumber).HasComputedColumnSql("CAST(BarCode AS Bigint)");

prodbarcode.HasIndex(ProdBarCode => 
       new { ProdBarCode.BarCodeNumber })
      .HasName("UK_ProdBarCode_BarCodeNumber")
      .IsUnique(true)
      .ForSqlServerIsClustered(false);

1 个答案:

答案 0 :(得分:0)

我今天遇到了这个问题。不幸的是,我无法从Entity Framework或Microsoft找到任何与此有关的信息。但是,我确实找到了适合我情况的解决方法。

如果您自己添加一个过滤器,并以一个或多个源列为目标,则它应达到相同的效果,并且是有效的SQL。查看下面的更新代码...

prodbarcode.Property<long>(ProdBarCode => 
       ProdBarCode.BarCodeNumber)
       .HasComputedColumnSql("CAST(BarCode AS Bigint)");

prodbarcode.HasIndex(ProdBarCode => 
       new { ProdBarCode.BarCodeNumber })
      .HasName("UK_ProdBarCode_BarCodeNumber")
      .IsUnique(true)
      .HasFilter($"{nameof(ProdBarCode.BarCode)} IS NOT NULL") // <-- filter on source field
      .ForSqlServerIsClustered(false);