1

私の EF モデルは、SQL Server データベースから生成されました。次に、EF モデルに対して RIAServices の DomainService を生成しました。エンティティの 1 つは「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属性を置き換え、元の GetEntryCategoriesSet メソッドに同様の linq フィルタリングを配置すると、プロジェクトはエラーなしでコンパイルされます。

生成された DomainService の何が特別で、私の新しい DomainService にはありませんか? そのmetadata.csファイルですか?

4

4 に答える 4

4

生成されたドメイン サービスの特別な点は、.metadata.cs ファイルではありません (保持して使用することはできますが、問題は解決しません)。

この問題は、RIA サービス (?) が公開された Linq to EF エンティティに対して「ドメイン サービス記述プロバイダー」を必要とするため、何らかの形で発生します。LinqToEntitiesDomainService クラスには LinqToEntitiesDomainServiceDescriptionProviderAttribute が既に適用されているため、それを継承する生成されたドメイン サービスもプロバイダーを継承します。

DomainService から派生した独自のカスタム ドメイン サービスを構築し、それを通じてエンティティを公開する場合は、この属性を自分で適用する必要があります。さらに、プロバイダーはドメイン サービスの基本クラスからオブジェクト コンテキスト タイプを推測できないため (基本クラスが LinqToEntitiesDomainService の場合は推測できます)、次のように属性コンストラクターでオブジェクト コンテキスト タイプを指定する必要があります。

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

それはそれを修正する必要があります。

これは、ドメイン サービスからオブジェクト コンテキストを抽象化することを望んでいた場合、がっかりすることを意味することに注意してください。私は、オブジェクト コンテキストで動作するすべてのコードがドメイン サービスによって使用されるプロバイダーに入る、一見人気のあるリポジトリ モデルを選択しました。これにより、単体テストが容易になりますが、オブジェクト コンテキストに対するドメイン サービスの依存関係が削除されないことは明らかです。RIA サービスがエンティティ、または少なくともドメイン エンティティによって参照されるエンティティ (この場合は EntryCategoriesVersions など) を理解するには、コンテキストが必要です。

于 2010-07-21T23:41:50.453 に答える
0

ドメイン サービスで特定のエンティティを公開する場合は、少なくとも 1 つのクエリ メソッドを提供する必要があります。これは、エンティティが別のエンティティの子としてのみアクセスされる場合にも必要です。

この場合、シナリオを正しく機能させるには、EntryCategoriesVersions エンティティセットをドメイン サービスに追加する必要があります。

于 2010-07-03T09:18:33.347 に答える
0

EntryCategoriesVersionsReference とはどのような型ですか? 型に対して [DataContract] 注釈を追加し、適切な [Key] と [DataMember] を追加してみてください。マーシャリングに役立つはずです。

于 2010-08-18T04:18:30.250 に答える
0

私にとって、このエラーの修正は、デフォルトのコンストラクターを戻り値の型に追加することでした。

OPの例では、プロパティ「EntryCategories.EntryCategoriesVersionsReference」は、デフォルトのコンストラクタを持つタイプである必要があります。

于 2018-11-30T07:46:16.883 に答える