我的EF模型是从我的SQL Server数据库生成的。然后,我针对EF模型为RIAServices生成了一个DomainService。其中一个实体称为“EntryCategories”。 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 :(得分:4)
生成的域服务的特殊之处不在于.metadata.cs文件(您可以保留它,并使用它,但它不能解决您的问题)。
问题以某种方式出现,因为RIA服务(?)需要为暴露的Linq到EF实体提供“域服务描述提供程序”。 LinqToEntitiesDomainService类已经应用了LinqToEntitiesDomainServiceDescriptionProviderAttribute,因此从中继承的生成的域服务也会继承提供者。
当您构建自己的自定义域服务(从DomainService派生)并通过它公开实体时,您需要自己应用此属性。此外,由于提供程序无法从域服务基类(它可以并且如果基类是LinqToEntitiesDomainService)中推断出对象上下文类型,您需要在属性构造函数中指定对象上下文类型,如下所示:
[EnableClientAccess()]
[LinqToEntitiesDomainServiceDescriptionProvider(
typeof(YourObjectContextType))]
public class ClientDomainService : DomainService
{
...
}
那应该解决它。
请注意,这意味着如果您希望将对象上下文从域服务中抽象出来,那么您会感到很失望。我选择了看似流行的存储库模型,其中在对象上下文上运行的所有代码都进入域服务使用的提供程序。这有利于单元测试,但显然不会删除域服务对对象上下文的依赖性。 RIA服务需要上下文来理解您的实体,或者至少是域实体引用的内容(例如您的案例中的EntryCategoriesVersions)。
答案 1 :(得分:0)
如果要在域服务上公开特定实体,则必须为其提供至少一种查询方法。当实体仅作为另一个实体的子级访问时,这也是必需的。
在这种情况下,您需要将EntryCategoriesVersions实体集添加到域服务,以使场景正常工作。
答案 2 :(得分:0)
EntryCategoriesVersionsReference是什么类型的?尝试针对类型添加[DataContract]注释,以及相应的[Key]和[DataMember]。它应该有助于编组。
答案 3 :(得分:0)
对我来说,此错误的解决方法是将默认构造函数添加到返回类型。
在OP的示例中,属性“ EntryCategories.EntryCategoriesVersionsReference”必须是具有默认构造函数的类型。