在我们的多层业务应用程序中,我们有ObservableCollections
从服务调用返回的自我跟踪实体。
我们的想法是我们希望能够从集合客户端获取实体、添加、更新和删除它们,然后将这些更改发送到服务器端,在那里它们将被持久化到数据库中。
自我跟踪实体,顾名思义,自己跟踪他们的状态。创建新的 STE 时,它具有已添加状态,当您修改属性时,它会设置已修改状态,它也可以具有已删除状态,但是当从实体中删除时ObservableCollection
(显然)不会设置此状态。如果您想要这种行为,您需要自己编写代码。
在我当前的实现中,当从 中删除实体时ObservableCollection
,我将其保存在影子集合中,以便在将ObservableCollection
发送回服务器时,我可以将删除的项目一起发送,以便 Entity Framework 知道删除它们。
类似于以下内容:
protected IDictionary<int, IList> DeletedCollections = new Dictionary<int, IList>();
protected void SubscribeDeletionHandler<TEntity>(ObservableCollection<TEntity> collection)
{
var deletedEntities = new List<TEntity>();
DeletedCollections[collection.GetHashCode()] = deletedEntities;
collection.CollectionChanged += (o, a) =>
{
if (a.OldItems != null)
{
deletedEntities.AddRange(a.OldItems.Cast<TEntity>());
}
};
}
现在,如果用户决定将他的更改保存到服务器,我可以获取已删除项目的列表,并将它们一起发送:
ObservableCollection<Customer> customers = MyServiceProxy.GetCustomers();
customers.RemoveAt(0);
MyServiceProxy.UpdateCustomers(customers);
此时,UpdateCustomers
如果删除了任何项目,该方法将验证我的影子集合,并将它们发送到服务器端。
这种方法效果很好,直到您开始考虑这些影子集合的生命周期。基本上,当ObservableCollection
垃圾回收时,我们无法知道我们需要从字典中删除影子集合。
我想出了一些复杂的解决方案,在这种情况下基本上可以进行手动内存管理。我每隔几秒钟检查一次引用是否处于非活动状态,在这种情况下,我会删除影子集合WeakReference
。ObservableCollection
但这似乎是一个糟糕的解决方案......我希望 StackOverflow 的集体天才能够阐明更好的解决方案。
编辑:
最后我决定继承ObservableCollection
. 生成了服务代理代码,因此将其更改为返回我的派生类型是一项相对简单的任务。
感谢所有的帮助!