【问题标题】:Entity Framework ObjectContext life cycle using WCF Ria使用 WCF Ria 的实体框架 ObjectContext 生命周期
【发布时间】:2012-10-02 00:49:28
【问题描述】:

我目前正在阅读 70-516 考试(访问数据)的自定进度培训工具包,并且正在阅读有关实体框架的章节。

我现在谈到 ObjectContext 并继承 IDisposable 进行清理。这带来了一些我在研究时似乎无法得到确切答案的问题。我只是想了解事情是如何运作的。


场景: 我使用 WCF Ria 和实体框架创建了一个 Silverlight 应用程序,并使用 MVVM Lite 模式。我制作了我的 EDMX 并创建了一个名为 FamilyService 的域服务,我在 silverlight 应用程序中将其用作 FamilyContext。我创建了一个名为 GetFamilyMembers 的方法,它从 FamilyMember 表中返回数据。

[EnableClientAccess()]
public partial class FamilyService : LinqToEntitiesDomainService<FamilyEntities>
{
    public IQueryable<FamilyMember> GetFamilyMembers()
    {
        return this.ObjectContext.FamilyMembers;
    }
}

在我的 ViewModel 中,我在构造 FamilyContext 时创建了一个实例,并在清理时将其设为空。


1) 当我将 FamilyContext 对象设为空时,它会对服务器上的 ObjectContext 做任何事情吗?我问这个是因为我从不在域服务中手动创建或处置它。

2) 我了解当我在 Entity Framework 中运行查询时,它会缓存数据。在 RIA 场景中,数据是缓存在客户端应用程序上的 FamilyContext 上,还是仍然驻留在服务器上的 ObjectContext 上?我只是好奇 ObjectContext 是否持有缓存,因为我的应用程序中的每个视图模型都创建了自己的 FamilyContext 实例,想知道视图模型是否因清理而变亮但仍然可以利用缓存。

提前致谢。

【问题讨论】:

  • 您不创建或处置ObjectContext?怎么可能?
  • 我不手动做,我假设它在 LinqToEntitiesDomainService 基类中?更新问题

标签: c# silverlight entity-framework-4 wcf-ria-services


【解决方案1】:

你需要多区分一点。

DomainService(您的 FamilyService)是服务器逻辑的一部分,每次请求/方法调用时都会创建一个服务实例(例如 QueryUpdateInsert、@987654327 @, Invoke) 是在您的服务上制作的。这是由 ASP.NET / WCF RIA 服务运行时完成的。

如果您想控制如何创建 DomainServices 实例,您需要实现自己的DomainServiceFactory。但这是一个高级场景。

所以每个请求都有自己的DomainService 实例,DomainService 也将拥有自己的ObjectContext 实例。调用完成后,ObjectContext 将被释放。只有在请求期间多次查询 ObjectContext 时才会发生这种情况下的缓存。

DomainContext 是域服务的有状态客户端表示,提供对服务所有功能的访问。它提供了一个缓存(又名 EntityCollections),其中包含从DomainService 加载的实体。缓存还用于更新或删除加载的实体以及插入新实体。需要提交对缓存的更改,以便在DomainService 上调用相应的方法来更新、删除或插入您的实体。

DomainContext 的实例是使用类的构造函数创建的,通常由您来创建和清理 DomainContext 的实例。因此,将 DomainContext 设置为 null 在服务器端没有任何作用。

【讨论】:

  • 谢谢,我相信你已经解决了这个问题。只是为了仔细检查,我的每个视图模型的 FamilyContext(在 vm 的构造函数上创建并在 vm 的清理事件上为空)具有基于其对域服务的调用的客户端数据的独立缓存。每次调用时,域服务都会创建 objectcontext 的一个实例,使用它,然后处理它,因此 ObjectContext 上的所有缓存数据都将消失。所以总而言之,我应该擅长清理,因为域服务处理服务器端对象,并且我正在手动清理我的客户端 FamilyContext。听起来对吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多