1

簡単に言うと、WCF Data Services の Entity Framework プロバイダーは、スキーマの名前空間と EntityContainer の名前を、それぞれ DbContext の名前空間とクラス名から直接取得します。これは、コード ファースト方式を使用して開発された DbContext にも当てはまります。

クラス名や EDM(X) を変更せずに、このプロバイダーの動作を事後的に変更する方法はありますか?

背景/警告/意見: これはプロトタイピングには便利な動作ですが、実稼働シナリオでは、クラス名自体が実装の詳細であり、サービス コンシューマーから隠されている必要があります。

さらに、私の場合、作成/拡張している非常に一般的な DbContext を提供するフレームワークを使用しているため、名前を変更することはできません。

データ モデルの CLR 表現と EDM 表現の間にさらに "スペース" を作成する方法については説明していないことに注意してください。DataService<T>むしろ、内部の CLR 名前空間と DbContext 拡張機能のクラス名 (EDM に保存されていますが、まったく問題ありません) が外部に公開されないように、拡張機能自体の動作を変更する方法を探しています。

サービス メタデータの特定のカスタマイズ ポイント (以下の custom-ns および custom-container):

<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
    <edmx:DataServices m:DataServiceVersion="1.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
        <Schema Namespace="<custom-ns>" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
            <EntityType Name="EgEntity">
                .
                .
                .
            </EntityType>
            .
            .
            .
            <EntityContainer Name="<custom-container>" m:IsDefaultEntityContainer="true">
                <EntitySet Name="EgEntity" EntityType="<custom-ns>.EgEntity" />
                .
                .
                .
            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>
4

1 に答える 1

0

Tableコード ファーストでは、注釈を使用して SSDL 内のテーブルのスキーマを指定できます(Schemaプロパティを参照)。残念ながら、CSDL で使用されているスキーマの名前空間を、属性またはモデル ビルダーのいずれかで上書きすることはできないと思います (詳しく調べていないことに注意してください)。

名前空間のエイリアスを試してみることもできますが、これが意図したとおりに機能するかどうかはわかりません。

モデルファーストとデータベースファーストでは、あなたの答えと思われるこの質問を参照してください。そうでない場合はお知らせください。

この回答はあまり役に立たないことは承知していますが、(特に) 運用環境であっても、コードベースに適切な名前空間を指定することをお勧めします。これは、通常のシナリオで名前空間を「非表示」にする理由がすぐにはわからないためですが、同意しない場合は、ユースケースを拡張してください。

そうは言っても、他の理由で適切な CLR 名前空間を異なる EDM スキーマにマップできる必要があることに同意します。意味がある限り、誰もが同じ名前を使用しても問題ないと思います。ところで、ベンダー プレフィックスを忘れないでください。特に、これらの名前をネットワークに公開しているためです。

コンテキスト クラスが封印されていない限り、サードパーティ フレームワークの名前空間は関連しないことに注意してください。通常、エンティティは POCO として定義されるため、通常は問題になりません。したがって、標準的な解決策は、エンティティとともに、独自の名前空間でこのジェネリック コンテキスト クラスを拡張することです。

于 2013-10-15T15:17:02.717 に答える