0

我有一个自引用表结构,与 EF 一起工作得很好,我用它来渲染树视图。EF 实体如下所示,我急切地加载了整个结构。

class ListItem
{
  int Id;
  string Text;
  ListItem ParentItem;
  IList<ListItem> ChildItems;
}

然后我在 UI 上添加了将新子节点添加到任何节点并使用 jQuery 重新排列节点的功能。更新后的结构使用相同的实体存储在会话中。

当我想使用 EF 将其保存回来时,我遇到了问题,因为我将它保存在另一个实体中,如下所示,并且MainEntity每当我想更新树时,我都会保存(更新)它。

class MainEntity
{
  ..
  ..
  IList<ListItem> Tree;
}

如何使用会话中的值更新此 Tree 属性并告诉 EF 保存它?如何更改该结构的父母和孩子以匹配新结构?

我正在考虑使用命令模式来记录 UI 的每个操作,并稍后在保存时在 EF 实体上重播它们。但这看起来有点矫枉过正:(

4

1 回答 1

0

经过几天徒劳地尝试不同的事情后,我终于实现了命令模式并让它按预期工作。

我为添加、更新、删除和重新排序 UI 操作实现了以下命令界面,并将它们填充到驻留在会话中的集合中。

public interface ITreeCommand
{
    void Execute(ICollection<ListItem> finalList, MainEntity source, ModelContainer db, ICollection<Guid> deletedIds);
}

然后在保存时,我执行这些命令以传递必要的参数。我必须db.SaveChanges()在每个执行方法实现中调用。我必须单独保留已删除的节点 ID,因为我可以通过在执行之前检查此列表来跳过任何不必要的添加、更新或重新排序。

希望有一天这对某人有所帮助。

于 2012-09-07T05:06:26.503 回答