使用WCF Ria的实体框架ObjectContext生命周期

时间:2012-10-02 00:49:28

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

我目前正在阅读70-516考试(访问数据)的自定进度培训套件,我在关于实体框架的章节中。

我正处于讨论ObjectContext并继承IDisposable进行清理的地步。这提出了一些问题,在研究时我似乎无法得到确切的答案。我只是想了解事情是如何运作的。


情景: 我使用WCF Ria和Entity Framework创建了一个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是否保存缓存,因为我的应用程序中的每个viewmodel都创建了自己的FamilyContext实例,想知道视图模型是否被清理减轻了,但仍然可以利用缓存。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您需要进一步区分。

DomainService(您的FamilyService)是服务器逻辑的一部分,每次请求/方法调用时都会创建服务实例(例如QueryUpdateInsertDeleteInvoke)是针对您的服务制作的。这是由ASP.NET / WCF RIA Services运行时完成的。

如果要控制DomainServices实例的创建方式,则需要实现自己的DomainServiceFactory。但这是一个高级方案。

因此,每个请求都会获得自己的DomainService实例,因此DomainService会有自己的ObjectContext实例。调用完成后,ObjectContext将被释放。只有在请求期间多次查询ObjectContext时,才会发生此方案中的缓存。

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

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