1

我的 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属性,并将类似的 linq 过滤放在原始的 GetEntryCategoriesSet 方法中,则项目编译没有错误。

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

4

4 回答 4

4

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

这个问题以某种方式出现,因为 RIA 服务 (?) 需要一个“域服务描述提供者”来将 Linq 暴露给 EF 实体。LinqToEntitiesDomainService 类具有已应用的 LinqToEntitiesDomainServiceDescriptionProviderAttribute,因此从它继承的生成的域服务也继承了提供程序。

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

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

那应该解决它。

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

于 2010-07-21T23:41:50.453 回答
0

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

于 2010-08-18T04:18:30.250 回答
0

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

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

于 2010-07-03T09:18:33.347 回答
0

对我来说,解决这个错误的方法是为返回类型添加一个默认构造函数。

在 OP 的示例中,属性“EntryCategories.EntryCategoriesVersionsReference”需要是具有默认构造函数的类型。

于 2018-11-30T07:46:16.883 回答