EF Core(C#) - 存储计算列

时间:2018-04-09 13:27:56

标签: c# ef-core-2.0

我想在我的数据库表中存储一个带有时间估计的类。 这有几个字段:

  • BestCase:TimeSpan
  • MostLikely:TimeSpan
  • WorstCase:TimeSpan

为了计算结果,我在我的类中添加了另一个名为“Estimated”(Timespan)的属性,该属性由以下公式计算:(BestCase + 4 * MostLikely + WorstCase)/ 6.

为了在获得大量估算时减少计算量,我想将此字段也存储在数据库表中。 (所以存储计算结果)

我该怎么做? (使用ModelBuilder,还是通过更改属性?)

我想在这种情况下,结果总是在读取属性时计算出来?

public TimeSpan Estimated
{
    get => (BestCase + 4 * MostLikely + WorstCase) / 6;
    set { }
}

1 个答案:

答案 0 :(得分:0)

将实体类getter和setter保留为默认值可能更好。

尝试按照示例here给出其中一条路径。

最简单的恕我直言,是以下解决方案。

  • 将getter和setter保留为默认值
  • 覆盖SaveChanges类中的SaveChangesAsyncDbContext,以使用包含以下代码的方法:

    var entries = ChangeTracker.Entries();
    foreach (var entry in entries)
    {
        if (entry.Entity is #insert type of your object#)
        {
            entry.Entity.Estimated = (BestCase + 4 * MostLikely + WorstCase) / 6;
        }
    }
    

备注:请注意,使用此解决方案时,如果您创建实体并在保存到数据库之前在上下文中使用该值,则不会设置该值。 您可以使用解决方案在get:上的值为空的情况下提供值:在getter中,检查是否有值。如果没有,请进行计算。