2009-10-22 34 views
1

我的EF模型是从我的SQL Server数据库生成的。然后我为EF模型生成了一个针对RIAServices的DomainService。其中一个实体被称为“EntryCategories”。在创建的DomainService这种方法:手工构建的RIAServices不受支持的类型DomainService

public IQueryable<EntryCategories> GetEntryCategoriesSet() 
{ 
    return this.Context.EntryCategoriesSet; 
} 

由于我的用户界面显示模式看起来与物理模型完全不同,我决定写我自己的DomainService对于和相关实体。是的,我知道我们要修改生成的内容,但它里面有很多东西,我想专注于一件小事。

我除去从所生成的DomainService的EnableClientAccess属性并增加了一个称为ClientDomainService新的类,并且在它包封所生成的DomainService:

[EnableClientAccess()] 
public class ClientDomainService : DomainService 
{ 
    // the generated domain service encapsulated in my new one. 
    private DataDomainService _dcds = new DataDomainService(); 

    // reimplement one of the DataDomainService methods 
    public IQueryable<EntryCategories> GetEntryCategories() 
    { 
     return (from t in _dcds.GetEntryCategoriesSet() where t.EntryCategoriesVersions.EntryCategoriesVersionId == datahead.EntryCategoriesVersions.EntryCategoriesVersionId orderby t.DisplayOrder select t); 
    } 
} 

我尝试的非常拳头的是要重新实现GetCateogoriesSet方法但基础数据是根据我班的另一个实体(未显示)过滤的。但是,当我建立这个,一个错误显示出来:

Entity 'DataProject.Web.EntryCategories' has a property 'EntryCategoriesVersionsReference' with an unsupported type 

如果我注释掉我CientDomainService,更换所产生的DomainService的EnableClientAccess属性,并把analagous LINQ过滤原GetEntryCategoriesSet方法,项目编译没有错误。

生成的DomainService对我的新服务没有什么特别之处?它是metadata.cs文件吗?

回答

0

如果您想公开某个域服务上的特定实体,您必须为其提供至少一种查询方法。当实体只作为另一个实体的孩子被访问时,这也是必需的。

在这种情况下,您需要将EntryCategoriesVersions实体集添加到域服务,以使场景正常工作。

4

生成的域服务的特殊之处不在于.metadata.cs文件(您可以保留它并使用它,但它不能解决您的问题)。

问题出现在某种程度上,因为RIA服务(?)需要一个'域名服务描述提供者'用于公开的Linq to EF实体。 LinqToEntitiesDomainService类具有已应用的LinqToEntitiesDomainServiceDescriptionProviderAttribute,因此从其继承的生成的域服务也继承提供者。

当您构建您自己的自定义域服务(从DomainService派生)并通过它公开实体时,您需要自己应用此属性。此外,由于提供者无法从域服务基类中推断出对象上下文类型(如果基类为LinqToEntitiesDomainService,它可以做什么),您需要在属性构造函数中指定对象上下文类型,如下所示:

[EnableClientAccess()] 
[LinqToEntitiesDomainServiceDescriptionProvider(
          typeof(YourObjectContextType))] 
public class ClientDomainService : DomainService 
{ 
    ... 
} 

这应该解决它。

请注意,这意味着如果您希望将您的对象上下文从您的域服务中抽离出来,您会感到失望。我选择了看似流行的存储库模型,其中对对象上下文进行操作的所有代码都进入了由域服务使用的提供者。这有助于单元测试,但显然不会删除域服务对对象上下文的依赖。RIA Services需要上下文来理解您的实体,或者至少那些由域实体引用的实体(例如您的案例中的EntryCategoriesVersions)。

+0

Tor Haugen的答案为我工作。我没有足够的代表来提高他的答案。我应该注意到,我为我的RIA服务域上下文创建了一个基类,可以在不同的项目中重用,而实际定义实体的类是我拥有[LinqToEntitiesDomainServiceDescriptionProvider]属性的类。因此,对objectcontext的强烈引用对我来说并不重要,因为我直接引用了来自该特定objectcontext的实体。感谢所有的帮助! – 2011-06-17 15:52:51

+0

有关此问题可能发生的方式的进一步说明,请通读此主题。 http://forums.silverlight.net/p/233457/583536.aspx – 2011-08-10 00:29:02

0

EntryCategoriesVersionsReference是什么类型?尝试根据类型添加一个[DataContract]注释,并添加适当的[Key]和[DataMember]。它应该有助于编组。

相关问题