Как реализовать автообновление вычисляемого столбца в коде C # - PullRequest
1 голос
/ 24 мая 2019

У меня проблема с вычисляемым столбцом в коде C # Entity Framework, которую я не могу решить, просмотрев любое другое решение, найденное в Интернете. Я считаю, что это потому, что моя проблема связана с расчетом это должно быть сделано после создания строки.

Рассмотрим этот упрощенный пример (сначала код):

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) для автоматического обновления когда дети добавляются к родителю?

Неправильно ли я считаю, что это можно сделать с помощью столбца Computed?

Кроме того, мне интересно, нужен ли метод ActualChildCount.get () что-то? (но это победило бы цель вычисляемого столбца, верно?)

...