Parent有一个属性LastChildrenName
和一个子列表。
parent.Children.Add(new Children(){ Name = "FirstChild" };
parent.Children.Add(new Children(){ Name = "SecondChild" };
parent.Children.Add(new Children(){ Name = "ThirdChild" };
DbContext.Set<Parent>.Update(parent);
DbContext.SaveChanges();
DbContext.SaveChanges();
在第一次调用SaveChanges()之前的调试期间, LastChildrenName
具有适当的ThirdChild
值,但是在SaveChanges()
只有新的Children行出现在db中,而LastChildrenName
列的值为SecondChild
。
在下一行代码之后再次调用SaveChanges()
会导致父类的LastChildrenName
列更新为适当的值。
但它也导致在父表上升两次更新触发器,我想避免。
我是否缺少EF Core设置或可以在父模型上使用的方式仅在数据库中更新一次?我还想避免更改LastChildrenName属性的get
方法。
public class Parent
{
public int Id;
public ICollection<Children> Childrens {get;set;}
public string LastChildrenName => this.Childrens.OrderBy(x => x.Id).Select(x => x.Name).LastOrDefault(x => !string.IsNullOrWhiteSpace(x));
}
儿童模特:
public class Children
{
public int Id;
public string Name;
public Parent Parent;
}
OrderBy(x => x.Id)
按ID OrderBy(x => x.Id)
,但在将子项保存到数据库之前,它们还没有已知的ID。因此,首先采用简单的情况,如果FirstChild
和SecondChild
已经使用ID 1
和2
保存,并且您的ThirdChild
已添加到上下文但尚未保存,则该第三个子项将被视为具有ID 0
,因此它将使感觉到SecondChild
仍被视为具有最高ID。
如果您一次只添加一个孩子,则可以修改OrderBy
以便0
始终显示在最后。例如,您可以编写OrderBy(x => x.Id == 0).ThenBy(x => x)
。
如果您同时添加多个子节点,我认为这根本不起作用,因为无法保证实体将以任何特定顺序保存到数据库中。您需要切换到在客户端而不是服务器上生成ID以使该方法有效。或者,您可以添加创建日期/时间和顺序。