Как программно создать CSDL или EDMX из набора существующих объектов POCO - PullRequest
1 голос
/ 10 ноября 2010

Я хотел бы смоделировать, что WCF Data Services делает с его тегом "$ metadata" ... то есть отправлять документ CSDL, который описывает существующий набор объектов, которые могут (или не могут) быть частью сущностиКаркасная модель.Фактически, предположим, что EF не является частью этого обсуждения ...

Я хочу создать службу, которая проверяет тип объектов, которые он может вернуть, генерирует документ CSDL и отправляет его клиенту, чтобыклиент может кодировать эти объекты из CSDL (использование EDMGen должно работать).После того как клиент сгенерировал объекты (и загрузил сгенерированную сборку), он может получать строго типизированные данные из службы.

Не похоже, что EDMGen можно использовать для генерации CSDL (или EDMX) из POCO... он может сделать это из db-соединения, и вы можете генерировать POCO из CSDL, но никак иначе.Есть ли способ, который кто-нибудь знает?

Конкретный пример

Учитывая этот код:

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>

Ответы [ 2 ]

1 голос
/ 26 ноября 2010

Я не уверен, было ли это сделано раньше, но довольно легко добиться того, что вы делаете, после использования T4 движка и отражения.

0 голосов
/ 10 ноября 2010

Не знаю, правильно ли я понял, что вы пытаетесь сделать, но я бы посоветовал вам взглянуть на атрибут MetadataType .Это то, что я использую в службах RIA ... затем можно использовать отражение для поиска свойств метаданных, которые вы хотите ...

Я надеюсь, что это, по крайней мере, близко к тому, что вы ищете:)

...