我正在计算另一列中的一列的值,因此需要在计算出的列上创建非聚集索引。
当我尝试使用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);
答案 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);