1

WCF Data Services が "$metadata" タグを使用して行うことをシミュレートしたいと思います。つまり、Entity Framework モデルの一部である (または含まれない) オブジェクトの既存のセットを記述する CSDL ドキュメントを送信します。実際、EF はこの議論の一部ではないと仮定します...

返すことができるオブジェクトのタイプを検査し、CSDL ドキュメントを生成してクライアントに送信し、クライアントが CSDL からそれらのオブジェクトをコード生成できるようにするサービスを作成したいと考えています (EDMGen を使用して動作するはずです)。クライアントがオブジェクトを生成 (および生成されたアセンブリを読み込む) すると、サービスから厳密に型指定されたデータを受け取ることができます。

EDMGen を使用して POCO から CSDL (または EDMX) を生成できるようには見えません... DB 接続から実行でき、CSDL から POCO を生成できますが、それ以外の方法はありません。誰もが知っているこれへの方法はありますか?

具体例

このコードを考えると:

public class DirectoryEntry
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public ICollection<DirectoryEntryProperty> Properties { get; set; }
}

public class DirectoryEntryProperty
{
    public int Id { get; set; }
    public string Key { get; set; }
    public string Value { get; set; }
    public DirectoryEntry DirectoryEntry { get ; set; }
}

このドキュメントを生成したい:

<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="DirectoryService" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:ib10="http://www.ideablade.com/edm/2010" ib10:Tag="DirectoryService">
  <EntityContainer Name="DirectoryServiceContainer" annotation:LazyLoadingEnabled="true" ib10:GenerateDeveloperClasses="true" ib10:DevForceEnabled="false">
    <EntitySet Name="DirectoryEntries" EntityType="DirectoryService.DirectoryEntry" />
    <EntitySet Name="DirectoryEntryProperties" EntityType="DirectoryService.DirectoryEntryProperty" />
    <AssociationSet Name="DirectoryEntryPropertyDirectoryEntry" Association="DirectoryService.DirectoryEntryPropertyDirectoryEntry">
      <End Role="DirectoryEntryProperty" EntitySet="DirectoryEntryProperties" />
      <End Role="DirectoryEntry" EntitySet="DirectoryEntries" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="DirectoryEntry">
    <Key>
      <PropertyRef Name="Id" />
    </Key>
    <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <Property Type="String" Name="Name" Nullable="false" />
    <Property Type="String" Name="Type" Nullable="false" />
    <NavigationProperty Name="Properties" Relationship="DirectoryService.DirectoryEntryPropertyDirectoryEntry" FromRole="DirectoryEntry" ToRole="DirectoryEntryProperty" ib10:Tag="DirectoryEntryPropertyCollectionHelper" />
  </EntityType>
  <EntityType Name="DirectoryEntryProperty">
    <Key>
      <PropertyRef Name="Id" />
    </Key>
    <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <NavigationProperty Name="DirectoryEntry" Relationship="DirectoryService.DirectoryEntryPropertyDirectoryEntry" FromRole="DirectoryEntryProperty" ToRole="DirectoryEntry" />
    <Property Type="Int32" Name="DirectoryEntryId" Nullable="false" />
    <Property Type="String" Name="Key" Nullable="false" />
    <Property Type="String" Name="Value" Nullable="false" />
  </EntityType>
  <Association Name="DirectoryEntryPropertyDirectoryEntry">
    <End Type="DirectoryService.DirectoryEntryProperty" Role="DirectoryEntryProperty" Multiplicity="*" />
    <End Type="DirectoryService.DirectoryEntry" Role="DirectoryEntry" Multiplicity="1" />
    <ReferentialConstraint>
      <Principal Role="DirectoryEntry">
        <PropertyRef Name="Id" />
      </Principal>
      <Dependent Role="DirectoryEntryProperty">
        <PropertyRef Name="DirectoryEntryId" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
</Schema>
4

2 に答える 2

1

これが以前に行われたかどうかはわかりませんが、T4エンジンとリフレクションを使用した後は、非常に簡単に達成できます。

于 2010-11-26T08:12:30.817 に答える
0

あなたがやろうとしていることを正しく理解できたかどうかはわかりませんが、MetadataType属性を確認することをお勧めします。それが私がRIAサービスで使用しているものです...その後、リフレクションを使用して、必要なメタデータプロパティを探すことができます...

これが少なくともあなたが探しているものに近いことを願っています:)

于 2010-11-10T20:08:15.043 に答える