如何实现C#代码优先的计算列自动更新

时间:2019-05-24 00:53:50

标签: c# code-first calculated-columns auto-update

我有一个C#实体框架代码优先的计算列问题,我无法通过查看在网络上找到的任何其他解决方案来解决。 我相信这是因为我的问题与计算有关 必须在创建行之后进行。

考虑以下简化示例(代码优先):

public class Parent
{
    [Key] public long Id;
    public int ExpectedChildCount { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public int ActualChildCount { get; private set; }

    public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
    [Key]  public long Id;  
    public long ParentId { get; set; }  // FK
    public virtual Parent Parent { get; set; }
}

执行“ Add-Migration ChildCountComputed”会产生以下结果, 在其中我修改了Up()方法:

public partial class ChildCountComputed : DbMigration
{
        public override void Up()
        {
            //AlterColumn("Parent", "ActualChildCount", c => c.Int(nullable: false));
            Sql("UPDATE Parent SET Parent.ActualChildCount = (SELECT COUNT(*) FROM Child c WHERE c.ParentId = Parent.Id)" );

        }

        public override void Down()
        {
            AlterColumn("dbo.ServerArchive", "ActualObjectInstanceCount", c => c.Int(nullable: false));
        }
}

我确认UPDATE命令有效并且已完成预期的操作 (为所有已经存在的父行更新Parent.ActualChildCount) 从LINQPad运行时。

但是,当程序首次创建父级时,它可能没有 孩子们后来,他们被添加。但是Parent.ActualChildCount永远不会 自动更新。

如何获取要自动更新的列(Parent.ActualChildCount) 何时将孩子添加到父母中?

我是否认为可以通过“计算列”完成操作?

此外,我不知道'ActualChildCount.get()'方法是否需要做 什么东西(但这会违反计算列的目的,对吧?)

0 个答案:

没有答案