entity-framework - 如何在 CRUD 场景中跟踪从 ObservableCollection 中删除的对象?

标签 entity-framework observablecollection lifecycle self-tracking-entities

在我们的多层业务应用程序中,我们有 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是垃圾收集没有办法知道我们需要从字典中删除影子收集。

我想出了一些复杂的解决方案,在这种情况下基本上可以进行手动内存管理。我保留了 WeakReferenceObservableCollection每隔几秒钟我检查一下引用是否处于非事件状态,在这种情况下我会删除影子集合。

但这似乎是一个糟糕的解决方案......我希望 StackOverflow 的集体天才能够阐明更好的解决方案。

编辑:

最后我决定继承 ObservableCollection .生成了服务代理代码,因此将其更改为返回我的派生类型是一项相对简单的任务。

感谢所有的帮助!

最佳答案

您可以使用 HttpRuntime.Cache 来代替滚动您自己的“弱引用 + 轮询 Is it Dead, Is it Alive”的逻辑。 (适用于所有项目类型,而不仅仅是 Web 项目)。

将每个影子集合添加到缓存中,或者使用一个大的超时时间,或者一个可以检查原始集合是否仍然存在的委托(delegate)(或两者兼而有之)。

它与您自己的解决方案并没有太大的不同,但它确实使用了久经考验且值得信赖的 .Net 组件。

除此之外,您正在考虑扩展 ObservableCollection 并改用该新类(我想这是一个不小的变化),或更改/包装 UpdateCustomers删除阴影收集表单的方法DeletedCollections
对不起,我想不出别的,但希望这会有所帮助。
体重

关于entity-framework - 如何在 CRUD 场景中跟踪从 ObservableCollection 中删除的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2948766/

相关文章:

c# - Entity Framework : field of composite key cannot be nullable?

c# - 如何在 T4 中实例化 EF6 上下文?

c# - 如何绑定(bind)可观察集合以查看可观察集合中存在的项目数?

c# - 将多个 ObservableCollection 绑定(bind)到一个 ObservableCollection

android - 测试 Android 应用程序中的内存泄漏

angular - 第一次加载页面时调用 ngOnDestroy

.net - 在表达式中包含方法类

c# - 获取导致异常的查询

wpf - 无法将类型 'MS.Internal.NamedObject' 的对象转换为自定义类型

android - 用于持久数据存储的 SQLite 或 SharedPreferences?