我有一个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()'方法是否需要做 什么东西(但这会违反计算列的目的,对吧?)