Especificação de CSDL

A linguagem de definição de esquema conceitual (CSDL) é uma linguagem baseada em XML que descreve as entidades, as relações e as funções que compõem um modelo conceitual de um aplicativo controlado por dados. Esse modelo conceitual pode ser usado pelo Entity Framework ou pelo WCF Data Services. Os metadados descritos com CSDL são usados pelo Entity Framework para mapear entidades e relações definidas em um modelo conceitual para uma fonte de dados. Para obter mais informações, consulte Especificação do SSDL e Especificação do MSL.

CDSL é a implementação do Entity Framework do Modelo de Dados de Entidade.

Em um aplicativo do Entity Framework, os metadados de modelo conceitual são carregados de um arquivo .csdl (escrito em CSDL) em uma instância da classe System.Data.Metadata.Edm.EdmItemCollection e são acessíveis usando métodos na classe System.Data.Metadata.Edm.MetadataWorkspace. O Entity Framework usa metadados de modelo conceitual para traduzir consultas no modelo conceitual para comandos específicos da fonte de dados.

O Designer de EF armazena informações de modelo conceitual em um arquivo .edmx em tempo de design. No momento do build, o Designer de EF usa informações em um arquivo .edmx para criar o arquivo .csdl necessário para o Entity Framework em runtime.

As versões do CSDL são diferenciadas por namespaces XML.

Versão do CSDL XML Namespace
CSDL v1 https://schemas.microsoft.com/ado/2006/04/edm
CSDL v2 https://schemas.microsoft.com/ado/2008/09/edm
CSDL v3 https://schemas.microsoft.com/ado/2009/11/edm

 

Elemento Association (CSDL)

Um elemento Association define uma relação entre dois tipos de entidade. Uma associação deve especificar os tipos de entidade envolvidos na relação e o possível número de tipos de entidade em cada extremidade da relação, que é conhecida como multiplicidade. A multiplicidade de uma extremidade de associação pode ter um valor de um (1), zero ou um (0,.1) ou muitos (*). Essas informações são especificadas em dois elementos finais filho.

Instâncias de tipo de entidade em uma extremidade de uma associação podem ser acessadas por meio de propriedades de navegação ou chaves estrangeiras, se forem expostas em um tipo de entidade.

Em um aplicativo, uma instância de uma associação representa uma associação específica entre instâncias de tipos de entidade. As instâncias de associação são agrupadas logicamente em um conjunto de associações.

Um elemento Association pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Fim (exatamente 2 elementos)
  • ReferentialConstraint (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Association.

Nome do atributo É Obrigatório Valor
Nome Sim O nome da associação.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Association. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento Association que define a associação CustomerOrders quando as chaves estrangeiras não foram expostas nos tipos de entidade Customer e Order. Os valores de Multiplicidade para cada End da associação indicam que muitas Orders podem ser associados a um Cliente, mas apenas um Cliente pode ser associado a uma Order. Além disso, o elemento OnDelete indica que todas as Orders relacionadas a um Customer específico e que foram carregados no ObjectContext serão excluídos se o Customer for excluído.

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" >
         <OnDelete Action="Cascade" />
   </End>
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
 </Association>

 

O exemplo a seguir mostra um elemento Associação que define a associação CustomerOrders quando chaves estrangeiras foram expostas nos tipos de entidade Customer e Order. Com chaves estrangeiras expostas, a relação entre as entidades é gerenciada com um elemento ReferentialConstraint. Um elemento AssociationSetMapping correspondente não é necessário para mapear essa associação para a fonte de dados.

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" >
         <OnDelete Action="Cascade" />
   </End>
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
   <ReferentialConstraint>
        <Principal Role="Customer">
            <PropertyRef Name="Id" />
        </Principal>
        <Dependent Role="Order">
             <PropertyRef Name="CustomerId" />
         </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

Elemento AssociationSet (CSDL)

O elemento AssociationSet na linguagem de definição de esquema conceitual (CSDL) é um contêiner lógico para instâncias de associação do mesmo tipo. Um conjunto de associações fornece uma definição para agrupar instâncias de associação para que possam ser mapeadas para uma fonte de dados.  

O elemento AssociationSet pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento permitido)
  • Fim (exatamente dois elementos necessários)
  • Elementos de anotação (zero ou mais elementos permitidos)

O atributo Association especifica o tipo de associação que um conjunto de associações contém. Os conjuntos de entidades que compõem as extremidades de um conjunto de associação são especificados com exatamente dois elementos End filho.

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento AssociationSet.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do conjunto de entidades. O valor do atributo Name não pode ser igual ao valor do atributo Association.
Associação Sim O nome totalmente qualificado da associação da qual o conjunto de associações contém instâncias. A associação deve estar no mesmo namespace que o conjunto de associações.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento AssociationSet. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EntityContainer com dois elementos AssociationSet:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

Elemento CollectionType (CSDL)

O elemento CollectionType na linguagem de definição de esquema conceitual (CSDL) especifica que um parâmetro de função ou tipo de retorno de função é uma coleção. O elemento CollectionType pode ser um filho do elemento Parameter ou do elemento ReturnType (Function). O tipo de coleção pode ser especificado usando o atributo Type ou um dos seguintes elementos filho:

  • CollectionType
  • ReferenceType
  • RowType
  • TypeRef

Observação

Um modelo não será validado se o tipo de uma coleção for especificado com o atributo Type e um elemento filho.

 

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento CollectionType. Observe que os atributos DefaultValue, MaxLength, FixedLength, Precision, Scale, Unicodee Collation são aplicáveis apenas a coleções de EDMSimpleTypes.

Nome do atributo É Obrigatório Valor
Tipo Não O tipo do conjunto.
Permite valor nulo Não True (o valor padrão) ou False, dependendo se a propriedade pode ter um valor nulo.
[!OBSERVAÇÃO]
> No CSDL v1, uma propriedade de tipo complexo deve ter Nullable="False".
DefaultValue Não O valor padrão da propriedade.
MaxLength Não O comprimento máximo do valor da propriedade.
FixedLength Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres de comprimento fixo.
Precisão Não A precisão do valor da propriedade.
Escala Não A escala do valor da propriedade.
SRID Não Identificador de referência do sistema espacial. Válido apenas para propriedades de tipos espaciais.   Para obter mais informações, consulte SRID e SRID (SQL Server)
Unicode Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres Unicode.
Ordenação Não Uma cadeia de caracteres que especifica a sequência de agrupamento a ser usada na fonte de dados.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento CollectionType. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra uma função definida pelo modelo que usa um elemento CollectionType para especificar que a função retorna uma coleção de tipos de entidade Person (conforme especificado com o atributo ElementType).

 <Function Name="LastNamesAfter">
        <Parameter Name="someString" Type="Edm.String"/>
        <ReturnType>
             <CollectionType  ElementType="SchoolModel.Person"/>
        </ReturnType>
        <DefiningExpression>
             SELECT VALUE p
             FROM SchoolEntities.People AS p
             WHERE p.LastName >= someString
        </DefiningExpression>
 </Function>

 

O exemplo a seguir mostra uma função definida pelo modelo que usa um elemento CollectionType para especificar que a função retorna uma coleção de linhas (conforme especificado no elemento RowType).

 <Function Name="LastNamesAfter">
   <Parameter Name="someString" Type="Edm.String" />
   <ReturnType>
    <CollectionType>
      <RowType>
        <Property Name="FirstName" Type="Edm.String" Nullable="false" />
        <Property Name="LastName" Type="Edm.String" Nullable="false" />
      </RowType>
    </CollectionType>
   </ReturnType>
   <DefiningExpression>
             SELECT VALUE ROW(p.FirstName, p.LastName)
             FROM SchoolEntities.People AS p
             WHERE p.LastName &gt;= somestring
   </DefiningExpression>
 </Function>

 

O exemplo a seguir mostra uma função definida pelo modelo que usa o elemento CollectionType para especificar que a função aceita como parâmetro uma coleção de tipos de entidade Department.

 <Function Name="GetAvgBudget">
      <Parameter Name="Departments">
          <CollectionType>
             <TypeRef Type="SchoolModel.Department"/>
          </CollectionType>
           </Parameter>
       <ReturnType Type="Collection(Edm.Decimal)"/>
       <DefiningExpression>
             SELECT VALUE AVG(d.Budget) FROM Departments AS d
       </DefiningExpression>
 </Function>

 

 

Elemento ComplexType (CSDL)

Um elemento ComplexType define uma estrutura de dados composta por propriedades EdmSimpleType ou outros tipos complexos.  Um tipo complexo pode ser uma propriedade de um tipo de entidade ou outro tipo complexo. Um tipo complexo é semelhante a um tipo de entidade no qual um tipo complexo define dados. No entanto, há algumas diferenças entre tipos complexos e tipos de entidade:

  • Tipos complexos não têm identidades (ou chaves) e, portanto, não podem existir independentemente. Tipos complexos só podem existir como propriedades de tipos de entidade ou outros tipos complexos.
  • Os tipos complexos não podem participar em associações. Nenhuma das extremidades de uma associação pode ser um tipo complexo e, portanto, as propriedades de navegação não podem ser definidas para tipos complexos.
  • Uma propriedade de tipo complexo não pode ter um valor nulo, embora as propriedades escalares de um tipo complexo possam ser definidas como nulas.

Um elemento ComplexType pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Propriedade (zero ou mais elementos)
  • Elementos de anotação (zero ou mais elementos)

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento ComplexType.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do tipo complexo. O nome de um tipo complexo não pode ser o mesmo que o nome de outro tipo complexo, tipo de entidade ou associação que esteja dentro do escopo do modelo.
BaseType Não O nome de outro tipo complexo que é o tipo base do tipo complexo que está sendo definido.
[!OBSERVAÇÃO]
> Esse atributo não é aplicável no CSDL v1. Não há suporte para herança para tipos complexos nessa versão.
Abstrata Não True ou False (o valor padrão) dependendo se o tipo complexo é um tipo abstrato.
[!OBSERVAÇÃO]
> Esse atributo não é aplicável no CSDL v1. Tipos complexos nessa versão não podem ser tipos abstratos.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento ComplexType. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um tipo complexo, Address, com as propriedades EdmSimpleType, StreetAddress, City, StateOrProvince, Countrye PostalCode.

 <ComplexType Name="Address" >
   <Property Type="String" Name="StreetAddress" Nullable="false" />
   <Property Type="String" Name="City" Nullable="false" />
   <Property Type="String" Name="StateOrProvince" Nullable="false" />
   <Property Type="String" Name="Country" Nullable="false" />
   <Property Type="String" Name="PostalCode" Nullable="false" />
 </ComplexType>

 

Para definir o tipo complexo Address (acima) como uma propriedade de um tipo de entidade, você deve declarar o tipo de propriedade na definição de tipo de entidade. O exemplo a seguir mostra a propriedade Address como um tipo complexo em um tipo de entidade (Publisher):

 <EntityType Name="Publisher">
       <Key>
         <PropertyRef Name="Id" />
       </Key>
       <Property Type="Int32" Name="Id" Nullable="false" />
       <Property Type="String" Name="Name" Nullable="false" />
       <Property Type="BooksModel.Address" Name="Address" Nullable="false" />
       <NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
                           FromRole="Publisher" ToRole="Book" />
     </EntityType>

 

 

Elemento DefiningExpression (CSDL)

O elemento DefiningExpression na linguagem de definição de esquema conceitual (CSDL) contém uma expressão de Entity SQL que define uma função no modelo conceitual.  

Observação

Para fins de validação, um elemento DefiningExpression pode conter conteúdo arbitrário. No entanto, o Entity Framework lançará uma exceção no runtime se um elemento DefiningExpression não contiver uma Entity SQL válida.

 

Atributos aplicáveis

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento DefiningExpression. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

Exemplo

O exemplo a seguir usa um elemento DefiningExpression para definir uma função que retorna o número de anos desde que um livro foi publicado. O conteúdo do elemento DefiningExpression é escrito no Entity SQL.

 <Function Name="GetYearsInPrint" ReturnType="Edm.Int32" >
       <Parameter Name="book" Type="BooksModel.Book" />
       <DefiningExpression>
         Year(CurrentDateTime()) - Year(cast(book.PublishedDate as DateTime))
       </DefiningExpression>
     </Function>

 

 

Elemento Dependent (CSDL)

O elemento Dependent na linguagem de definição de esquema conceitual (CSDL) é um elemento filho para o elemento ReferentialConstraint e define o final dependente de uma restrição referencial. Um elemento ReferentialConstraint define uma funcionalidade semelhante a uma restrição de integridade referencial em um banco de dados relacional. Da mesma forma que uma coluna (ou colunas) de uma tabela de banco de dados pode referenciar a chave primária de outra tabela, uma propriedade (ou propriedades) de um tipo de entidade pode referenciar a chave de entidade de outro tipo de entidade. O tipo de entidade referenciado é chamado de extremidade principal da restrição. O tipo de entidade que faz referência à extremidade principal é chamado de extremidade dependente da restrição. Elementos PropertyRef são usados para especificar quais chaves fazem referência ao final principal.

O elemento Dependent pode ter os seguintes elementos filho (na ordem listada):

  • PropertyRef (um ou mais elementos)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Dependent.

Nome do atributo É Obrigatório Valor
Função Sim O nome do tipo de entidade no final dependente da associação.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Dependent. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento ReferentialConstraint sendo usado como parte da definição da associação PublishedBy. A propriedade PublisherId do tipo de entidade Book compõe a extremidade dependente da restrição referencial.

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

Elemento Documentation (CSDL)

O elemento Documentation na linguagem de definição de esquema conceitual (CSDL) pode ser usado para fornecer informações sobre um objeto definido em um elemento pai. Em um arquivo .edmx, quando o elemento Documentation for filho de um elemento que aparece como um objeto na superfície de design do Designer EF (como uma entidade, associação ou propriedade), o conteúdo do elemento filhoDocumentation será exibido na janela Propriedades do Visual Studio do objeto.

O elemento Documentation pode ter os seguintes elementos filho (na ordem listada):

  • Resumo: uma breve descrição do elemento pai. (zero ou um elemento)
  • LongDescription: uma descrição abrangente do elemento pai. (zero ou um elemento)
  • Elementos de anotação. (zero ou mais elementos)

Atributos aplicáveis

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Documentation. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

Exemplo

O exemplo a seguir mostra o elemento Documentation como um elemento filho de um elemento EntityType. Se o snippet de código abaixo estiver no conteúdo CSDL de um arquivo .edmx, o conteúdo do Resumo e elementos LongDescription aparecerão na janela Propriedades do Visual Studio quando você clicar no tipo de entidade Customer.

 <EntityType Name="Customer">
    <Documentation>
      <Summary>Summary here.</Summary>
      <LongDescription>Long description here.</LongDescription>
    </Documentation>
    <Key>
      <PropertyRef Name="CustomerId" />
    </Key>
    <Property Type="Int32" Name="CustomerId" Nullable="false" />
    <Property Type="String" Name="Name" Nullable="false" />
 </EntityType>

 

 

Elemento End (CSDL)

O elemento End na linguagem de definição de esquema conceitual (CSDL) pode ser um filho do elemento Association ou do elemento AssociationSet. Em cada caso, a função do elemento End é diferente e os atributos aplicáveis são diferentes.

Elemento End como um filho do elemento Association

Um elemento End (como um filho do elemento Association) identifica o tipo de entidade em uma extremidade de uma associação e o número de instâncias de tipo de entidade que podem existir nesse final de uma associação. Termina de associação são definidas como parte de uma associação; uma associação deve ter exatamente duas termina de associação. As entidades de tipo de entidade em uma extremidade de uma associação podem ser acessadas por meio de propriedades de navegação ou de chaves estrangeiras se forem expostas em um tipo de entidade.  

Um elemento End pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • OnDelete (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento End quando ele é filho de um elemento Association.

Nome do atributo É Obrigatório Valor
Tipo Sim O nome do tipo de entidade em uma extremidade da associação.
Função Não Um nome para o final da associação. Se nenhum nome for fornecido, o nome do tipo de entidade no final da associação será usado.
Multiplicidade Sim 1, 0..1 ou * dependendo do número de instâncias de tipo de entidade que podem estar no final da associação.
1 indica que existe exatamente uma instância de tipo de entidade no final da associação.
0..1 indica que existem instâncias de tipo de entidade zero ou uma no final da associação.
* indica que zero, uma ou mais instâncias de tipo de entidade existem no final da associação.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento End. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento Association que define a associação CustomerOrders. Os valores de Multiplicidade para cada End da associação indicam que muitas Orders podem ser associados a um Cliente, mas apenas um Cliente pode ser associado a uma Order. Além disso, o elemento OnDelete indica que todos os Orders relacionados a um Customer específico e que foram carregados no ObjectContext serão excluídos se o Customer for excluído.

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" />
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*">
         <OnDelete Action="Cascade" />
   </End>
 </Association>

 

Elemento End como um filho do elemento AssociationSet

O elemento End especifica uma extremidade de um conjunto de associações. O elemento AssociationSet deve conter dois elementos End. As informações contidas em um elemento End são usadas no mapeamento de um conjunto de associações para uma fonte de dados.

Um elemento End pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Observação

Os elementos de anotação devem aparecer depois de todos os outros elementos filho. Os elementos de anotação só são permitidos no CSDL v2 e posterior.

 

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento End quando ele é filho de um elemento filhoAssociationSet.

Nome do atributo É Obrigatório Valor
EntitySet Sim O nome do elemento EntitySet que define uma extremidade do elemento AssociationSet pai. O elemento EntitySet deve ser definido no mesmo contêiner de entidade que o elemento AssociationSet pai.
Função Não O nome do final do conjunto de associações. Se o atributo Role não for usado, o nome do final do conjunto de associações será o nome do conjunto de entidades.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento End. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EntityContainer com dois elementos AssociationSet, cada um com dois elementos End:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

Elemento EntityContainer (CSDL)

O elemento EntityContainer na linguagem de definição de esquema conceitual (CSDL) é um contêiner lógico para conjuntos de entidades, conjuntos de associações e importações de função. Um contêiner de entidade de modelo conceitual é mapeado para um contêiner de entidade de modelo de armazenamento por meio do elemento EntityContainerMapping. Um contêiner de entidade de modelo de armazenamento descreve a estrutura do banco de dados: conjuntos de entidades descrevem tabelas, conjuntos de associações descrevem restrições de chave estrangeira e importações de função descrevem procedimentos armazenados em um banco de dados.

Um elemento EntityContainer pode ter zero ou um elemento de Documentação. Se um elemento Documentation estiver presente, ele deverá preceder todos os elementos EntitySet, AssociationSet e FunctionImport.

Um elemento EntityContainer pode ter zero ou mais dos seguintes elementos filho (na ordem listada):

  • EntitySet
  • AssociationSet
  • FunctionImport
  • Elementos de anotação

Você pode estender um elemento EntityContainer para incluir o conteúdo de outro EntityContainer que esteja dentro do mesmo namespace. Para incluir o conteúdo de outro EntityContainer, no elemento de referência EntityContainer, defina o valor do atributo Extends para o nome do elemento EntityContainer que você deseja incluir. Todos os elementos filho do elemento EntityContainer incluído serão tratados como elementos filho do elemento EntityContainer de referência.

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Using.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do contêiner de entidade.
Extends Não O nome de outro contêiner de entidade dentro do mesmo namespace.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento EntityContainer. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EntityContainer que define três conjuntos de entidades e dois conjuntos de associação.

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

Elemento EntitySet (CSDL)

O elemento EntitySet na linguagem de definição de esquema conceitual é um contêiner lógico para instâncias de um tipo de entidade e instâncias de qualquer tipo derivado desse tipo de entidade. A relação entre um tipo de entidade e um conjunto de entidades é análoga à relação entre uma linha e uma tabela em um banco de dados relacional. Como uma linha, um tipo de entidade define um conjunto de dados relacionados e, como uma tabela, um conjunto de entidades contém instâncias dessa definição. Um conjunto de entidades fornece um constructo para agrupar instâncias de tipo de entidade para que possam ser mapeadas para estruturas de dados relacionadas em uma fonte de dados.  

Mais de um conjunto de entidades para um tipo de entidade específico pode ser definido.

Observação

O Designer de EF não dá suporte a modelos conceituais que contêm vários conjuntos de entidades por tipo.

 

O elemento EntitySet pode ter os seguintes elementos filho (na ordem listada):

  • Elemento Documentation (zero ou um elemento permitido)
  • Elementos de anotação (zero ou mais elementos permitidos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento EntitySet.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do conjunto de entidades.
EntityType Sim O nome totalmente qualificado do tipo de entidade para o qual o conjunto de entidades contém instâncias.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento EntitySet. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EntityContainer com três elementos EntitySet:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

É possível definir vários conjuntos de entidades por tipo (MEST). O exemplo a seguir define um contêiner de entidade com dois conjuntos de entidades para o tipo de entidade Book:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="FictionBooks" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="BookAuthor" Association="BooksModel.BookAuthor">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

Elemento EntityType (CSDL)

O elemento EntityType representa a estrutura de um conceito de nível superior, como um cliente ou pedido, em um modelo conceitual. Um tipo de entidade é um modelo para instâncias de tipos de entidade em um aplicativo. Cada modelo contém as informações a seguir:

  • Um nome exclusivo. (Obrigatório.)
  • Uma chave de entidade definida por uma ou mais propriedades. (Obrigatório.)
  • Propriedades para conter dados. (Opcional).
  • Propriedades de navegação, que permitem a navegação de uma extremidade de uma associação até a outra extremidade. (Opcional).

Em um aplicativo, uma instância de um tipo de entidade representa um objeto específico (como um cliente ou uma ordem específica.) Cada instância de um tipo de entidade deve ter uma chave de entidade exclusiva dentro de um conjunto de entidades.

Duas instâncias do tipo de entidade são consideradas iguais somente se são do mesmo tipo e os valores das chaves de entidade são os mesmos.

Um elemento EntityType pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Chave (zero ou um elemento)
  • Propriedade (zero ou mais elementos)
  • NavigationProperty (zero ou mais elementos)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento EntityType.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do tipo de entidade.
BaseType Não O nome de outro tipo de entidade que é o tipo básico do tipo de entidade que está sendo definido.
Resumo Não True ou False, dependendo se o tipo de entidade é um tipo abstrato.
OpenType Não True ou False, dependendo se o tipo de entidade é um tipo de entidade aberta.
[!OBSERVAÇÃO]
> O atributo OpenType só é aplicável a tipos de entidade definidos em modelos conceituais que são usados com Serviços de Dados do ADO.NET.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento EntityType. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EntityType com três elementos de Propriedade e dois elementos NavigationProperty:

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

 

Elemento EnumType (CSDL)

O elemento EnumType representa um tipo enumerado.

Um elemento EnumType pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Membro (zero ou mais elementos)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento EnumType.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do tipo de entidade.
IsFlags Não True ou False, dependendo se o tipo de enumeração pode ser usado como um conjunto de sinalizadores. O valor padrão é False..
UnderlyingType Não Edm.Byte, Edm.Int16, Edm.Int32, Edm.Int64 ou Edm.SByte definindo o intervalo de valores do tipo.   O tipo padrão subjacente de elementos de enumeração é Edm.Int32..

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento EnumType. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EnumType com três elementos Member:

 <EnumType Name="Color" IsFlags=”false” UnderlyingTyp=”Edm.Byte”>
   <Member Name="Red" />
   <Member Name="Green" />
   <Member Name="Blue" />
 </EntityType>

 

 

Elemento Function (CSDL)

O elemento Function na linguagem de definição de esquema conceitual (CSDL) é usado para definir ou declarar funções no modelo conceitual. Uma função é definida usando um elemento DefiningExpression.  

Um elemento Function pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Parâmetro (zero ou mais elementos)
  • DefinindoExpression (zero ou um elemento)
  • ReturnType (Função) (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Um tipo de retorno para uma função deve ser especificado com o elemento ReturnType (Function) ou o atributo ReturnType (veja abaixo), mas não ambos. Os tipos de retorno possíveis são qualquer EdmSimpleType, tipo de entidade, tipo complexo, tipo de linha ou tipo ref (ou uma coleção de um desses tipos).

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Function.

Nome do atributo É Obrigatório Valor
Nome Sim O nome da função.
ReturnType Não O tipo retornado pela função.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Function. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir usa um elemento Function para definir uma função que retorna o número de anos desde que um instrutor foi contratado.

 <Function Name="YearsSince" ReturnType="Edm.Int32">
   <Parameter Name="date" Type="Edm.DateTime" />
   <DefiningExpression>
     Year(CurrentDateTime()) - Year(date)
   </DefiningExpression>
 </Function>

 

 

Elemento FunctionImport (CSDL)

O elemento FunctionImport na linguagem de definição de esquema conceitual (CSDL) representa uma função definida na fonte de dados, mas disponível para objetos por meio do modelo conceitual. Por exemplo, um elemento Function no modelo de armazenamento pode ser usado para representar um procedimento armazenado em um banco de dados. Um elemento FunctionImport no modelo conceitual representa a função correspondente em um aplicativo Entity Framework e é mapeado para a função de modelo de armazenamento usando o elemento FunctionImportMapping. Quando a função é chamada no aplicativo, o procedimento armazenado correspondente é executado no banco de dados.

O elemento FunctionImport pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento permitido)
  • Parâmetro (zero ou mais elementos permitidos)
  • Elementos de anotação (zero ou mais elementos permitidos)
  • ReturnType (FunctionImport) (zero ou mais elementos permitidos)

Um elemento Parameter deve ser definido para cada parâmetro que a função aceita.

Um tipo de retorno para uma função deve ser especificado com o elemento ReturnType (FunctionImport) ou o atributo ReturnType (veja abaixo), mas não ambos. O valor do tipo de retorno deve ser uma coleção de EdmSimpleType, EntityType ou ComplexType.

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento FunctionImport.

Nome do atributo É Obrigatório Valor
Nome Sim O nome da função importada.
ReturnType Não O tipo que a função retorna. Não use esse atributo se a função não retorna um valor. Caso contrário, o valor deve ser uma coleção de ComplexType, EntityType ou EDMSimpleType.
EntitySet Não Se a função retornar uma coleção de tipos de entidade, o valor do EntitySet deverá ser a entidade definida à qual a coleção pertence. Caso contrário, o atributo EntitySet não deve ser usado.
IsComposable Não Se o valor for definido como true, a função será redigida (Função com valor de tabela) e poderá ser usada em uma consulta LINQ.  O padrão é false.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento FunctionImport. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento FunctionImport que aceita um parâmetro e retorna uma coleção de tipos de entidade:

 <FunctionImport Name="GetStudentGrades"
                 EntitySet="StudentGrade"
                 ReturnType="Collection(SchoolModel.StudentGrade)">
        <Parameter Name="StudentID" Mode="In" Type="Int32" />
 </FunctionImport>

 

 

Elemento Key (CSDL)

O elemento Key é um elemento filho do elemento EntityType e define uma chave de entidade (uma propriedade ou um conjunto de propriedades de um tipo de entidade que determina a identidade). As propriedades que compõem uma chave de entidade são escolhidas em tempo de design. Os valores das propriedades de chave de entidade devem exclusivamente identificar uma instância do tipo de entidade dentro de conjunto de entidades em tempo de execução. As propriedades que compõem uma chave de entidade devem ser escolhidas para garantir a exclusividade de instâncias em um conjunto de entidades. O elemento Key define uma chave de entidade fazendo referência a uma ou mais das propriedades de um tipo de entidade.

O elemento Key pode ter os seguintes elementos filho:

  • PropertyRef (um ou mais elementos)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Key. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

Exemplo

O exemplo a seguir define um tipo de entidade chamado Book. A chave de entidade é definida fazendo referência à propriedade ISBN do tipo de entidade.

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

A propriedade ISBN é uma boa opção para a chave de entidade porque um ISBN (Número de Livro Padrão Internacional) identifica exclusivamente um livro.

O exemplo a seguir mostra um tipo de entidade (Author) que tem uma chave de entidade que consiste em duas propriedades, Name e Address.

 <EntityType Name="Author">
   <Key>
     <PropertyRef Name="Name" />
     <PropertyRef Name="Address" />
   </Key>
   <Property Type="String" Name="Name" Nullable="false" />
   <Property Type="String" Name="Address" Nullable="false" />
   <NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
                       FromRole="Author" ToRole="Book" />
 </EntityType>

 

Usar Name e Address para a chave de entidade é uma opção razoável, pois é improvável que dois autores com o mesmo nome residam no mesmo endereço. No entanto, esta opção para uma chave de entidade não garante absolutamente chaves exclusivas de entidade em um conjunto de entidades. Adicionar uma propriedade, como AuthorId, que poderia ser usada para identificar exclusivamente um autor seria recomendada nesse caso.

 

Elemento Member (CSDL)

O elemento Member é um elemento filho do elemento EnumType e define um membro do tipo enumerado.

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento FunctionImport.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do membro.
Valor Não O valor do membro. Por padrão, o primeiro membro tem o valor 0 e o valor de cada enumerador sucessivo é incrementado em 1. Podem existir vários membros com os mesmos valores.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento FunctionImport. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EnumType com três elementos Member:

 <EnumType Name="Color">
   <Member Name="Red" Value=”1”/>
   <Member Name="Green" Value=”3” />
   <Member Name="Blue" Value=”5”/>
 </EntityType>

 

 

Um elemento NavigationProperty define uma propriedade de navegação, que fornece uma referência à outra extremidade de uma associação. Ao contrário das propriedades definidas com o elemento Property, as propriedades de navegação não definem a forma e as características dos dados. Eles fornecem uma maneira de navegar por uma associação entre dois tipos de entidade.

Observe que as propriedades de navegação são opcionais em ambos os tipos de entidade termina de uma associação. Se você definir uma propriedade de navegação em um tipo de entidade no final de uma associação, você não precisa definir uma propriedade de navegação no tipo de entidade no outro extremo de associação.

O tipo de dados retornado por uma propriedade de navegação é determinado pela multiplicidade de seu final de associação remota. Por exemplo, suponha que uma propriedade de navegação, OrdersNavProp, exista em um tipo de entidade Customer e navegue por uma associação um-para-muitos entre Customer e Order. Como o final da associação remota para a propriedade de navegação tem multiplicidade muitos (*), seu tipo de dados é uma coleção (de Order). Da mesma forma, se uma propriedade de navegação, CustomerNavProp, existir no tipo de entidade Order, seu tipo de dados será Customer, pois a multiplicidade do extremidade remoto é uma (1).

Um elemento NavigationProperty pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento NavigationProperty.

Nome do atributo É Obrigatório Valor
Nome Sim O nome da propriedade de navegação.
Relacionamento Sim O nome de uma associação que está dentro do escopo do modelo.
ToRole Sim O fim da associação na qual a navegação termina. O valor do atributo ToRole deve ser o mesmo que o valor de um dos atributos Role definidos em uma das extremidades de associação (definido no elemento AssociationEnd).
FromRole Sim O fim da associação da qual a navegação começa. O valor do atributo FromRole deve ser o mesmo que o valor de um dos atributos Role definidos em uma das extremidades de associação (definido no elemento AssociationEnd).

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento NavigationProperty. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir define um tipo de entidade (Book) com duas propriedades de navegação (PublishedBy e WrittenBy):

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

 

Elemento OnDelete (CSDL)

O elemento OnDelete na linguagem de definição de esquema conceitual (CSDL) define o comportamento que está conectado a uma associação. Se o atributo Action for definido como Cascade em uma extremidade de uma associação, os tipos de entidade relacionada na outra extremidade da associação serão excluídos quando o tipo de entidade na primeira extremidade for excluído. Se a associação entre dois tipos de entidade for uma relação de chave primária para chave primária, um objeto dependente carregado será excluído quando o objeto principal na outra extremidade da associação for excluído, independentemente da especificação OnDelete.  

Observação

O elemento OnDelete afeta apenas o comportamento de runtime de um aplicativo; ele não afeta o comportamento na fonte de dados. O comportamento definido na fonte de dados deve ser o mesmo que o comportamento definido no aplicativo.

 

Um elemento OnDelete pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento OnDelete.

Nome do atributo É Obrigatório Valor
Ação Sim Cascade ou None. Se Cascade, os tipos de entidade dependentes serão excluídos quando o tipo de entidade principal for excluído. Se None, os tipos de entidade dependentes não serão excluídos quando o tipo de entidade principal for excluído.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Association. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento Association que define a associação CustomerOrders. O elemento OnDelete indica que todos os Orders relacionados a um Customer específico e que foram carregados no ObjectContext serão excluídos quando o Customer for excluído.

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1">
         <OnDelete Action="Cascade" />
   </End>
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
 </Association>

 

 

Elemento Parameter (CSDL)

O elemento Parameter na linguagem de definição de esquema conceitual (CSDL) pode ser um filho do elemento FunctionImport ou do elemento Function.

Aplicativo de elemento FunctionImport

Um elemento Parameter (como filho do elemento FunctionImport ) é usado para definir parâmetros de entrada e saída para importações de função declaradas em CSDL.

O elemento Parameter pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento permitido)
  • Elementos de anotação (zero ou mais elementos permitidos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Parameter.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do parâmetro.
Tipo Sim O tipo de parâmetro. O valor deve ser um EDMSimpleType ou um tipo complexo que está dentro do escopo do modelo.
Modo Não In, Out ou InOut, dependendo se o parâmetro é um parâmetro de entrada, saída ou entrada/saída.
MaxLength Não O comprimento máximo permitido do parâmetro.
Precisão Não A precisão do parâmetro.
Escala Não A escala do parâmetro.
SRID Não Identificador de referência do sistema espacial. Válido somente para parâmetros de tipos espaciais. Para obter mais informações, consulte SRID e SRID (SQL Server).

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Parameter. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento FunctionImport com um elemento filho Parameter. A função aceita um parâmetro de entrada e retorna uma coleção de tipos de entidade.

 <FunctionImport Name="GetStudentGrades"
                 EntitySet="StudentGrade"
                 ReturnType="Collection(SchoolModel.StudentGrade)">
        <Parameter Name="StudentID" Mode="In" Type="Int32" />
 </FunctionImport>

 

Aplicativo de elemento de função

Um elemento Parameter (como um filho do elemento Function) define parâmetros para funções definidas ou declaradas em um modelo conceitual.

O elemento Parameter pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • CollectionType (zero ou um elemento)
  • ReferenceType (zero ou um elemento)
  • RowType (zero ou um elemento)

Observação

Apenas um dos elementos CollectionType, ReferenceType ou RowType pode ser um elemento filho de um elemento Property.

 

  • Elementos de anotação (zero ou mais elementos permitidos)

Observação

Os elementos de anotação devem aparecer depois de todos os outros elementos filho. Os elementos de anotação só são permitidos no CSDL v2 e posterior.

 

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Parameter.

Nome do atributo É Obrigatório Valor
Nome Sim O nome do parâmetro.
Tipo Não O tipo de parâmetro. Um parâmetro pode ser qualquer um dos seguintes tipos (ou coleções desses tipos):
EdmSimpleType
tipo de entidade
tipo complexo
tipo de linha
tipo de referência
Permite valor nulo Não True (o valor padrão) ou False, dependendo se a propriedade pode ter um valor null.
DefaultValue Não O valor padrão da propriedade.
MaxLength Não O comprimento máximo do valor da propriedade.
FixedLength Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres de comprimento fixo.
Precisão Não A precisão do valor da propriedade.
Escala Não A escala do valor da propriedade.
SRID Não Identificador de referência do sistema espacial. Válido apenas para propriedades de tipos espaciais. Para obter mais informações, consulte SRID e SRID (SQL Server).
Unicode Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres Unicode.
Ordenação Não Uma cadeia de caracteres que especifica a sequência de agrupamento a ser usada na fonte de dados.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Parameter. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento Function que usa um elemento filho Parameter para definir um parâmetro de função.

 <Function Name="GetYearsEmployed" ReturnType="Edm.Int32">
 <Parameter Name="Instructor" Type="SchoolModel.Person" />
   <DefiningExpression>
   Year(CurrentDateTime()) - Year(cast(Instructor.HireDate as DateTime))
   </DefiningExpression>
 </Function>

 

Elemento Principal (CSDL)

O elemento Principal na linguagem de definição de esquema conceitual (CSDL) é um elemento filho para o elemento ReferentialConstraint que define o final principal de uma restrição referencial. Um elemento ReferentialConstraint define uma funcionalidade semelhante a uma restrição de integridade referencial em um banco de dados relacional. Da mesma forma que uma coluna (ou colunas) de uma tabela de banco de dados pode referenciar a chave primária de outra tabela, uma propriedade (ou propriedades) de um tipo de entidade pode referenciar a chave de entidade de outro tipo de entidade. O tipo de entidade referenciado é chamado de extremidade principal da restrição. O tipo de entidade que faz referência à extremidade principal é chamado de extremidade dependente da restrição. Os elementos PropertyRef são usados para especificar quais chaves são referenciadas pelo final dependente.

O elemento Principal pode ter os seguintes elementos filho (na ordem listada):

  • PropertyRef (um ou mais elementos)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Principal.

Nome do atributo É Obrigatório Valor
Função Sim O nome do tipo de entidade no final principal da associação.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Principal. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento ReferentialConstraint que faz parte da definição da associação PublishedBy. A propriedade ID do tipo de entidade Publisher compõe a extremidade principal da restrição referencial.

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

Elemento Property (CSDL)

O elemento Property na linguagem de definição de esquema conceitual (CSDL) pode ser um filho do elemento EntityType, do elemento ComplexType ou do elemento RowType.

Aplicativos de elementos EntityType e ComplexType

Os elementos de Property (como filhos de elementos EntityType ou ComplexType) definem a forma e as características dos dados que uma instância de tipo de entidade ou instância de tipo complexo conterá. As propriedades em um modelo conceitual são análogas às propriedades definidas em uma classe. Da mesma forma que as propriedades em uma classe definem a forma da classe e transportam informações sobre objetos, as propriedades em um modelo conceitual definem a forma de um tipo de entidade e transportam informações sobre as instâncias dos tipos de entidade.

O elemento Property pode ter os seguintes elementos filho (na ordem listada):

  • Elemento Documentation (zero ou um elemento permitido)
  • Elementos de anotação (zero ou mais elementos permitidos)

As seguintes facetas podem ser aplicadas a um elemento Property: Nullable, DefaultValue, MaxLength, FixedLength, Precision, Scale, Unicode, Collation, ConcurrencyMode. Facetas são atributos XML que fornecem informações sobre como os valores de propriedade são armazenados no armazenamento de dados.

Observação

As facetas só podem ser aplicadas às propriedades do tipo EDMSimpleType.

 

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Property.

Nome do atributo É Obrigatório Valor
Nome Sim O nome da propriedade.
Tipo Sim O tipo do valor da propriedade. O tipo de valor de propriedade deve ser um EDMSimpleType ou um tipo complexo (indicado por um nome totalmente qualificado) que está dentro do escopo do modelo.
Permite valor nulo Não True (o valor padrão) ou False, dependendo se a propriedade pode ter um valor nulo.
[!OBSERVAÇÃO]
> No CSDL v1, uma propriedade de tipo complexo deve ter Nullable="False".
DefaultValue Não O valor padrão da propriedade.
MaxLength Não O comprimento máximo do valor da propriedade.
FixedLength Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres de comprimento fixo.
Precisão Não A precisão do valor da propriedade.
Escala Não A escala do valor da propriedade.
SRID Não Identificador de referência do sistema espacial. Válido apenas para propriedades de tipos espaciais. Para obter mais informações, consulte SRID e SRID (SQL Server).
Unicode Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres Unicode.
Ordenação Não Uma cadeia de caracteres que especifica a sequência de agrupamento a ser usada na fonte de dados.
ConcurrencyMode Não Nenhum (o valor padrão) ou Fixo. Se o valor for definido como Fixo, o valor da propriedade será usado na verificação de simultaneidade otimista.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Property. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento EntityType com três elementos Property:

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

O exemplo a seguir mostra um elemento ComplexType com cinco elementos Property:

 <ComplexType Name="Address" >
   <Property Type="String" Name="StreetAddress" Nullable="false" />
   <Property Type="String" Name="City" Nullable="false" />
   <Property Type="String" Name="StateOrProvince" Nullable="false" />
   <Property Type="String" Name="Country" Nullable="false" />
   <Property Type="String" Name="PostalCode" Nullable="false" />
 </ComplexType>

 

Aplicativo de elemento RowType

Os elementos de Property (como filhos de um elemento RowType) definem a forma e as características dos dados que podem ser passados ou retornados de uma função definida pelo modelo.  

O elemento Property pode ter exatamente um dos seguintes elementos filho:

  • CollectionType
  • ReferenceType
  • RowType

O elemento Property pode ter qualquer número de elementos de anotação filho.

Observação

Os elementos de anotação só são permitidos no CSDL v2 e posterior.

 

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento Property.

Nome do atributo É Obrigatório Valor
Nome Sim O nome da propriedade.
Tipo Sim O tipo do valor da propriedade.
Permite valor nulo Não True (o valor padrão) ou False, dependendo se a propriedade pode ter um valor nulo.
[!OBSERVAÇÃO]
> No CSDL v1, uma propriedade de tipo complexo deve ter Nullable="False".
DefaultValue Não O valor padrão da propriedade.
MaxLength Não O comprimento máximo do valor da propriedade.
FixedLength Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres de comprimento fixo.
Precisão Não A precisão do valor da propriedade.
Escala Não A escala do valor da propriedade.
SRID Não Identificador de referência do sistema espacial. Válido apenas para propriedades de tipos espaciais. Para obter mais informações, consulte SRID e SRID (SQL Server).
Unicode Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres Unicode.
Ordenação Não Uma cadeia de caracteres que especifica a sequência de agrupamento a ser usada na fonte de dados.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Property. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra elementos Property usados para definir a forma do tipo de retorno de uma função definida pelo modelo.

 <Function Name="LastNamesAfter">
   <Parameter Name="someString" Type="Edm.String" />
   <ReturnType>
    <CollectionType>
      <RowType>
        <Property Name="FirstName" Type="Edm.String" Nullable="false" />
        <Property Name="LastName" Type="Edm.String" Nullable="false" />
      </RowType>
    </CollectionType>
   </ReturnType>
   <DefiningExpression>
             SELECT VALUE ROW(p.FirstName, p.LastName)
             FROM SchoolEntities.People AS p
             WHERE p.LastName &gt;= somestring
   </DefiningExpression>
 </Function>

 

 

Elemento PropertyRef (CSDL)

O elemento PropertyRef na linguagem de definição de esquema conceitual (CSDL) faz referência a uma propriedade de um tipo de entidade para indicar que a propriedade executará uma das seguintes funções:

  • Parte da chave da entidade (uma propriedade ou um conjunto de propriedades de um tipo de entidade que determina a identidade). Um ou mais elementos PropertyRef podem ser usados para definir uma chave de entidade.
  • O final dependente ou principal de uma restrição referencial.

O elemento PropertyRef só pode ter elementos de anotação (zero ou mais) como elementos filho.

Observação

Os elementos de anotação só são permitidos no CSDL v2 e posterior.

 

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento PropertyRef.

Nome do atributo É Obrigatório Valor
Nome Sim O nome da propriedade referenciada.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento PropertyRef. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir define um tipo de entidade (Book). A chave de entidade é definida fazendo referência à propriedade ISBN do tipo de entidade.

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

No próximo exemplo, dois elementos PropertyRef são usados para indicar que duas propriedades (Id e PublisherId) são as extremidades principal e dependente de uma restrição referencial.

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

Elemento ReferenceType (CSDL)

O elemento ReferenceType na linguagem de definição de esquema conceitual (CSDL) especifica uma referência a um tipo de entidade. O elemento ReferenceType pode ser um filho dos seguintes elementos:

  • ReturnType (Função)
  • Parâmetro
  • CollectionType

O elemento ReferenceType é usado ao definir um parâmetro ou tipo de retorno para uma função.

Um elemento ReferenceType pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento ReferenceType.

Nome do atributo É Obrigatório Valor
Tipo Sim O nome do tipo de entidade que está sendo referenciado.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento ReferenceType. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra o elemento ReferenceType usado como filho de um elemento Parameter em uma função definida pelo modelo que aceita uma referência a um tipo de entidade Person:

 <Function Name="GetYearsEmployed" ReturnType="Edm.Int32">
   <Parameter Name="instructor">
     <ReferenceType Type="SchoolModel.Person" />
   </Parameter>
   <DefiningExpression>
   Year(CurrentDateTime()) - Year(cast(instructor.HireDate as DateTime))
   </DefiningExpression>
 </Function>

 

O exemplo a seguir mostra o elemento ReferenceType usado como um filho de um elemento ReturnType (Function) em uma função definida por modelo que retorna uma referência a um tipo de entidade Person:

 <Function Name="GetPersonReference">
     <Parameter Name="p" Type="SchoolModel.Person" />
     <ReturnType>
         <ReferenceType Type="SchoolModel.Person" />
     </ReturnType>
     <DefiningExpression>
           REF(p)
     </DefiningExpression>
 </Function>

 

 

Elemento ReferentialConstraint (CSDL)

Um elemento ReferentialConstraint na linguagem de definição de esquema conceitual (CSDL) define uma funcionalidade semelhante a uma restrição de integridade referencial em um banco de dados relacional. Da mesma forma que uma coluna (ou colunas) de uma tabela de banco de dados pode referenciar a chave primária de outra tabela, uma propriedade (ou propriedades) de um tipo de entidade pode referenciar a chave de entidade de outro tipo de entidade. O tipo de entidade referenciado é chamado de extremidade principal da restrição. O tipo de entidade que faz referência à extremidade principal é chamado de extremidade dependente da restrição.

Se uma chave estrangeira exposta em um tipo de entidade fizer referência a uma propriedade em outro tipo de entidade, o elemento ReferentialConstraint definirá uma associação entre os dois tipos de entidade. Como o elemento ReferentialConstraint fornece informações sobre como dois tipos de entidade estão relacionados, nenhum elemento AssociationSetMapping correspondente é necessário na linguagem de especificação de mapeamento (MSL). Uma associação entre dois tipos de entidade que não têm chaves estrangeiras expostas deve ter um elemento AssociationSetMapping correspondente para mapear informações de associação para a fonte de dados.

Se uma chave estrangeira não for exposta em um tipo de entidade, o elemento ReferentialConstraint só poderá definir uma restrição de chave primária para chave primária entre o tipo de entidade e outro tipo de entidade.

Um elemento ReferentialConstraint pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Principal (exatamente um elemento)
  • Dependente (exatamente um elemento)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

O elemento ReferentialConstraint pode ter qualquer número de atributos de anotação (atributos XML personalizados). No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

Exemplo

O exemplo a seguir mostra um elemento ReferentialConstraint sendo usado como parte da definição da associação PublishedBy.

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

Elemento ReturnType (Function) (CSDL)

O elemento ReturnType (Function) na linguagem de definição de esquema conceitual (CSDL) especifica o tipo de retorno para uma função que é definida em um elemento Function. Um tipo de retorno de função também pode ser especificado com um atributo ReturnType.

Os tipos de retorno podem ser qualquer EdmSimpleType, tipo de entidade, tipo complexo, tipo de linha, tipo de ref ou uma coleção de um desses tipos.

O tipo de retorno de uma função pode ser especificado com o atributo Type do elemento ReturnType (Function) ou com um dos seguintes elementos filho:

  • CollectionType
  • ReferenceType
  • RowType

Observação

Um modelo não será validado se você especificar um tipo de retorno de função com o atributo Type do elemento ReturnType (Function) e um dos elementos filho.

 

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento ReturnType (Function).

Nome do atributo É Obrigatório Valor
ReturnType Não O tipo retornado pela função.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento ReturnType (Function). No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir usa um elemento Function para definir uma função que retorna o número de anos em que um livro foi impresso. Observe que o tipo de retorno é especificado pelo atributo Type de um elemento ReturnType (Function).

 <Function Name="GetYearsInPrint">
   <ReturnType Type=="Edm.Int32">
   <Parameter Name="book" Type="BooksModel.Book" />
   <DefiningExpression>
    Year(CurrentDateTime()) - Year(cast(book.PublishedDate as DateTime))
   </DefiningExpression>
 </Function>

 

 

Elemento ReturnType (FunctionImport) (CSDL)

O elemento ReturnType (FunctionImport) na linguagem de definição de esquema conceitual (CSDL) especifica o tipo de retorno para uma função definida em um elemento FunctionImport. Um tipo de retorno de função também pode ser especificado com um atributo ReturnType.

Os tipos de retorno podem ser qualquer coleção de tipo de entidade, tipo complexo ou EdmSimpleType,

O tipo de retorno de uma função é especificado com o atributo Type do elemento ReturnType (FunctionImport).

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento ReturnType (FunctionImport).

Nome do atributo É Obrigatório Valor
Tipo Não O tipo que a função retorna. O valor deve ser uma coleção de ComplexType, EntityType ou EDMSimpleType.
EntitySet Não Se a função retornar uma coleção de tipos de entidade, o valor do EntitySet deverá ser a entidade definida à qual a coleção pertence. Caso contrário, o atributo EntitySet não deve ser usado.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento ReturnType (FunctionImport). No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir usa um FunctionImport que retorna livros e editores. Observe que a função retorna dois conjuntos de resultados e, portanto, dois elementos ReturnType (FunctionImport) são especificados.

 <FunctionImport Name="GetBooksAndPublishers">
   <ReturnType Type=="Collection(BooksModel.Book )" EntitySet=”Books”>
   <ReturnType Type=="Collection(BooksModel.Publisher)" EntitySet=”Publishers”>
 </FunctionImport>

 

 

Elemento RowType (CSDL)

Um elemento RowType na linguagem de definição de esquema conceitual (CSDL) define uma estrutura sem nome como um parâmetro ou tipo de retorno para uma função definida no modelo conceitual.

Um elemento RowType pode ser o filho dos seguintes elementos:

  • CollectionType
  • Parâmetro
  • ReturnType (Função)

Um elemento RowType pode ter os seguintes elementos filho (na ordem listada):

  • Propriedade (uma ou mais)
  • Elementos de anotação (zero ou mais)

Atributos aplicáveis

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento RowType. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

Exemplo

O exemplo a seguir mostra uma função definida pelo modelo que usa um elemento CollectionType para especificar que a função retorna uma coleção de linhas (conforme especificado no elemento RowType).

 <Function Name="LastNamesAfter">
   <Parameter Name="someString" Type="Edm.String" />
   <ReturnType>
    <CollectionType>
      <RowType>
        <Property Name="FirstName" Type="Edm.String" Nullable="false" />
        <Property Name="LastName" Type="Edm.String" Nullable="false" />
      </RowType>
    </CollectionType>
   </ReturnType>
   <DefiningExpression>
             SELECT VALUE ROW(p.FirstName, p.LastName)
             FROM SchoolEntities.People AS p
             WHERE p.LastName &gt;= somestring
   </DefiningExpression>
 </Function>

Elemento Schema (CSDL)

O elemento Schema é o elemento raiz de uma definição de modelo conceitual. Ele contém definições para objetos, funções e contêineres que compõem um modelo conceitual.

O elemento Schema pode conter zero ou mais dos seguintes elementos filho:

  • Usar
  • EntityContainer
  • EntityType
  • EnumType
  • Associação
  • ComplexType
  • Função

Um elemento Schema pode conter zero ou um elemento de anotação.

Observação

O elemento Function e os elementos de anotação só são permitidos no CSDL v2 e posterior.

 

O elemento Schema usa o atributo Namespace para definir o namespace para o tipo de entidade, o tipo complexo e os objetos de associação em um modelo conceitual. Em um namespace, nenhum objeto pode ter o mesmo nome. Os namespaces podem abranger vários elementos Schema e vários arquivos .csdl.

Um namespace de modelo conceitual é diferente do namespace XML do elemento Schema. Um namespace de modelo conceitual (conforme definido pelo atributo Namespace) é um contêiner lógico para tipos de entidade, tipos complexos e tipos de associação. O namespace XML (indicado pelo atributo xmlns) de um elemento filhoSchema é o namespace padrão para elementos filho e atributos do elemento Schema. Namespaces XML do formulário https://schemas.microsoft.com/ado/YYYY/MM/edm (em que YYYY e MM representam um ano e um mês, respectivamente) são reservados para CSDL. Elementos e atributos personalizados não podem estar em namespaces que tenham esse formulário.

Atributos aplicáveis

A tabela a seguir descreve que os atributos podem ser aplicados ao elemento Schema.

Nome do atributo É Obrigatório Valor
Namespace Sim O namespace do modelo conceitual. O valor do atributo Namespace é usado para formar o nome totalmente qualificado de um tipo. Por exemplo, se um EntityType chamado Customer estiver no namespace Simple.Example.Model, o nome totalmente qualificado do EntityType será SimpleExampleModel.Customer.
As cadeias de caracteres a seguir não podem ser usadas como o valor do atributo Namespace: System, Transient ou Edm. O valor do atributo Namespace não pode ser o mesmo que o valor do atributo Namespace no elemento SSDL Schema.
Alias Não Um identificador usado no lugar do nome do namespace. Por exemplo, se um EntityType chamado Customer estiver no namespace Simple.Example.Model e o valor do atributo Alias for Model, você poderá usar Model.Customer como o nome totalmente qualificado do EntityType.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Schema. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra um elemento Schema que contém um elemento EntityContainer, dois elementos EntityType e um elemento Association.

 <Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
      xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
      xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
       Namespace="ExampleModel" Alias="Self">
         <EntityContainer Name="ExampleModelContainer">
           <EntitySet Name="Customers"
                      EntityType="ExampleModel.Customer" />
           <EntitySet Name="Orders" EntityType="ExampleModel.Order" />
           <AssociationSet
                       Name="CustomerOrder"
                       Association="ExampleModel.CustomerOrders">
             <End Role="Customer" EntitySet="Customers" />
             <End Role="Order" EntitySet="Orders" />
           </AssociationSet>
         </EntityContainer>
         <EntityType Name="Customer">
           <Key>
             <PropertyRef Name="CustomerId" />
           </Key>
           <Property Type="Int32" Name="CustomerId" Nullable="false" />
           <Property Type="String" Name="Name" Nullable="false" />
           <NavigationProperty
                    Name="Orders"
                    Relationship="ExampleModel.CustomerOrders"
                    FromRole="Customer" ToRole="Order" />
         </EntityType>
         <EntityType Name="Order">
           <Key>
             <PropertyRef Name="OrderId" />
           </Key>
           <Property Type="Int32" Name="OrderId" Nullable="false" />
           <Property Type="Int32" Name="ProductId" Nullable="false" />
           <Property Type="Int32" Name="Quantity" Nullable="false" />
           <NavigationProperty
                    Name="Customer"
                    Relationship="ExampleModel.CustomerOrders"
                    FromRole="Order" ToRole="Customer" />
           <Property Type="Int32" Name="CustomerId" Nullable="false" />
         </EntityType>
         <Association Name="CustomerOrders">
           <End Type="ExampleModel.Customer"
                Role="Customer" Multiplicity="1" />
           <End Type="ExampleModel.Order"
                Role="Order" Multiplicity="*" />
           <ReferentialConstraint>
             <Principal Role="Customer">
               <PropertyRef Name="CustomerId" />
             </Principal>
             <Dependent Role="Order">
               <PropertyRef Name="CustomerId" />
             </Dependent>
           </ReferentialConstraint>
         </Association>
       </Schema>

 

 

Elemento TypeRef (CSDL)

O elemento TypeRef na linguagem de definição de esquema conceitual (CSDL) fornece uma referência a um tipo nomeado existente. O elemento TypeRef pode ser um filho do elemento CollectionType, que é usado para especificar que uma função tem uma coleção como um parâmetro ou tipo de retorno.

Um elemento TypeRef pode ter os seguintes elementos filho (na ordem listada):

  • Documentação (zero ou um elemento)
  • Elementos de anotação (zero ou mais elementos)

Atributos aplicáveis

A tabela a seguir descreve os atributos que podem ser aplicados ao elemento TypeRef. Observe que os atributos DefaultValue, MaxLength, FixedLength, Precision, Scale, Unicode e Collation são aplicáveis apenas a EDMSimpleTypes.

Nome do atributo É Obrigatório Valor
Tipo Não O nome do tipo que está sendo referenciado.
Permite valor nulo Não True (o valor padrão) ou False, dependendo se a propriedade pode ter um valor nulo.
[!OBSERVAÇÃO]
> No CSDL v1, uma propriedade de tipo complexo deve ter Nullable="False".
DefaultValue Não O valor padrão da propriedade.
MaxLength Não O comprimento máximo do valor da propriedade.
FixedLength Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres de comprimento fixo.
Precisão Não A precisão do valor da propriedade.
Escala Não A escala do valor da propriedade.
SRID Não Identificador de referência do sistema espacial. Válido apenas para propriedades de tipos espaciais. Para obter mais informações, consulte SRID e SRID (SQL Server).
Unicode Não True ou False, dependendo se o valor da propriedade será armazenado como uma cadeia de caracteres Unicode.
Ordenação Não Uma cadeia de caracteres que especifica a sequência de agrupamento a ser usada na fonte de dados.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento CollectionType. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir mostra uma função definida pelo modelo que usa o elemento TypeRef (como filho de um elemento CollectionType) para especificar que a função aceita uma coleção de tipos de entidade de Department.

 <Function Name="GetAvgBudget">
      <Parameter Name="Departments">
          <CollectionType>
             <TypeRef Type="SchoolModel.Department"/>
          </CollectionType>
           </Parameter>
       <ReturnType Type="Collection(Edm.Decimal)"/>
       <DefiningExpression>
             SELECT VALUE AVG(d.Budget) FROM Departments AS d
       </DefiningExpression>
 </Function>

 

 

Usando elemento (CSDL)

O elemento Using na linguagem de definição de esquema conceitual (CSDL) importa o conteúdo de um modelo conceitual que existe em um namespace diferente. Ao definir o valor do atributo Namespace, você pode se referir a tipos de entidade, tipos complexos e tipos de associação definidos em outro modelo conceitual. Mais de um elemento Using pode ser filho de um elemento Schema.

Observação

O elemento Using em CSDL não funciona exatamente como uma instrução using em uma linguagem de programação. Ao importar um namespace com uma instrução using em uma linguagem de programação, você não afeta objetos no namespace original. No CSDL, um namespace importado pode conter um tipo de entidade derivado de um tipo de entidade no namespace original. Isso pode afetar os conjuntos de entidades declarados no namespace original.

 

O elemento Using pode ter os seguintes elementos filho:

  • Documentação (zero ou um elemento permitido)
  • Elementos de anotação (zero ou mais elementos permitidos)

Atributos aplicáveis

A tabela a seguir descreve que os atributos podem ser aplicados ao elemento Using.

Nome do atributo É Obrigatório Valor
Namespace Sim O nome do namespace importado.
Alias Sim Um identificador usado no lugar do nome do namespace. Embora esse atributo seja necessário, não é necessário que ele seja usado no lugar do nome do namespace para qualificar nomes de objeto.

 

Observação

Qualquer número de atributos de anotação (atributos XML personalizados) pode ser aplicado ao elemento Using. No entanto, os atributos personalizados podem não pertencer a nenhum namespace XML reservado para CSDL. Os nomes totalmente qualificados para dois atributos personalizados não podem ser os mesmos.

 

Exemplo

O exemplo a seguir demonstra o elemento Using que está sendo usado para importar um namespace definido em outro lugar. Observe que o namespace do elemento Schema mostrado é BooksModel. A propriedade Address no PublisherEntityType é um tipo complexo definido no namespace ExtendedBooksModel (importado com o elemento Using).

 <Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
           xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
           xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
           Namespace="BooksModel" Alias="Self">

     <Using Namespace="BooksModel.Extended" Alias="BMExt" />

 <EntityContainer Name="BooksContainer" >
       <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
     </EntityContainer>

 <EntityType Name="Publisher">
       <Key>
         <PropertyRef Name="Id" />
       </Key>
       <Property Type="Int32" Name="Id" Nullable="false" />
       <Property Type="String" Name="Name" Nullable="false" />
       <Property Type="BMExt.Address" Name="Address" Nullable="false" />
     </EntityType>

 </Schema>

 

 

Atributos de anotação (CSDL)

Atributos de anotação na linguagem de definição de esquema conceitual (CSDL) são atributos XML personalizados no modelo conceitual. Além de ter uma estrutura XML válida, o seguinte deve ser verdadeiro para atributos de anotação:

  • Os atributos de anotação não devem estar em nenhum namespace XML reservado para CSDL.
  • Mais de um atributo de anotação pode ser aplicado a um determinado elemento CSDL.
  • Os nomes totalmente qualificados de dois atributos de anotação não devem ser os mesmos.

Atributos de anotação podem ser usados para fornecer metadados extras sobre os elementos em um modelo conceitual. Metadados contidos em elementos de anotação podem ser acessados em runtime usando classes no namespace System.Data.Metadata.Edm.

Exemplo

O exemplo a seguir mostra um elemento EntityType com um atributo de anotação (CustomAttribute). O exemplo também mostra um elemento de anotação aplicado ao elemento de tipo de entidade.

 <Schema Namespace="SchoolModel" Alias="Self"
         xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
         xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
   <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
     <EntitySet Name="People" EntityType="SchoolModel.Person" />
   </EntityContainer>
   <EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
               p:CustomAttribute="Data here.">
     <Key>
       <PropertyRef Name="PersonID" />
     </Key>
     <Property Name="PersonID" Type="Int32" Nullable="false"
               annotation:StoreGeneratedPattern="Identity" />
     <Property Name="LastName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="FirstName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="HireDate" Type="DateTime" />
     <Property Name="EnrollmentDate" Type="DateTime" />
     <p:CustomElement>
       Custom metadata.
     </p:CustomElement>
   </EntityType>
 </Schema>

 

O código a seguir recupera os metadados no atributo de anotação e o grava no console:

 EdmItemCollection collection = new EdmItemCollection("School.csdl");
 MetadataWorkspace workspace = new MetadataWorkspace();
 workspace.RegisterItemCollection(collection);
 EdmType contentType;
 workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
 if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomAttribute"))
 {
     MetadataProperty annotationProperty =
         contentType.MetadataProperties["http://CustomNamespace.com:CustomAttribute"];
     object annotationValue = annotationProperty.Value;
     Console.WriteLine(annotationValue.ToString());
 }

 

O código acima pressupõe que o arquivo School.csdl está no diretório de saída do projeto e que você adicionou as seguintes instruções Imports e Using ao seu projeto:

 using System.Data.Metadata.Edm;

 

 

Elementos de anotação (CSDL)

Elementos de anotação na linguagem de definição de esquema conceitual (CSDL) são elementos XML personalizados no modelo conceitual. Além de ter uma estrutura XML válida, o seguinte deve ser verdadeiro para elementos de anotação:

  • Os elementos de anotação não devem estar em nenhum namespace XML reservado para CSDL.
  • Mais de um elemento de anotação pode ser filho de um determinado elemento CSDL.
  • Os nomes totalmente qualificados de qualquer dois elementos de anotação não devem ser os mesmos.
  • Os elementos de anotação devem aparecer depois de todos os outros elementos filho de um determinado elemento CSDL.

Os elementos de anotação podem ser usados para fornecer metadados extras sobre os elementos em um modelo conceitual. A partir do .NET Framework versão 4, os metadados contidos em elementos de anotação podem ser acessados em runtime usando classes no namespace System.Data.Metadata.Edm.

Exemplo

O exemplo a seguir mostra um elemento EntityType com um elemento de anotação (CustomElement). O exemplo também mostra um atributo de anotação aplicado ao elemento de tipo de entidade.

 <Schema Namespace="SchoolModel" Alias="Self"
         xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
         xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
   <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
     <EntitySet Name="People" EntityType="SchoolModel.Person" />
   </EntityContainer>
   <EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
               p:CustomAttribute="Data here.">
     <Key>
       <PropertyRef Name="PersonID" />
     </Key>
     <Property Name="PersonID" Type="Int32" Nullable="false"
               annotation:StoreGeneratedPattern="Identity" />
     <Property Name="LastName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="FirstName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="HireDate" Type="DateTime" />
     <Property Name="EnrollmentDate" Type="DateTime" />
     <p:CustomElement>
       Custom metadata.
     </p:CustomElement>
   </EntityType>
 </Schema>

 

O código a seguir recupera os metadados no elemento de anotação e o grava no console:

 EdmItemCollection collection = new EdmItemCollection("School.csdl");
 MetadataWorkspace workspace = new MetadataWorkspace();
 workspace.RegisterItemCollection(collection);
 EdmType contentType;
 workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
 if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomElement"))
 {
     MetadataProperty annotationProperty =
         contentType.MetadataProperties["http://CustomNamespace.com:CustomElement"];
     object annotationValue = annotationProperty.Value;
     Console.WriteLine(annotationValue.ToString());
 }

 

O código acima pressupõe que o arquivo School.csdl está no diretório de saída do projeto e que você adicionou as seguintes instruções Imports e Using ao seu projeto:

 using System.Data.Metadata.Edm;

 

 

Tipos de modelo conceitual (CSDL)

A CSDL (linguagem de definição de esquema conceitual) dá suporte a um conjunto de tipos de dados primitivos abstratos, chamados EDMSimpleTypes, que definem propriedades em um modelo conceitual. EDMSimpleTypes são proxies para tipos de dados primitivos com suporte no ambiente de armazenamento ou hospedagem.

A tabela a seguir lista os tipos de dados primitivos com suporte do CSDL. A tabela também lista as facetas que podem ser aplicadas a cada EDMSimpleType.

EDMSimpleType Descrição Facetas aplicáveis
Edm.Binary Contém dados binários. MaxLength, FixedLength, anulável, opção
Edm.Boolean Contém o valor true ou false. Anulável, opção
Edm.Byte Contém um valor inteiro de 8 bits sem sinal. Precisão, anulável, opção
Edm.DateTime Representa uma data e hora. Precisão, anulável, opção
Edm.DateTimeOffset Contém uma data e hora como um deslocamento em minutos GMT. Precisão, anulável, opção
Edm.Decimal Contém um valor numérico com precisão e escala fixa. Precisão, anulável, opção
Edm.Double Contém um número de ponto flutuante com precisão de 15 dígitos Precisão, anulável, opção
Edm.Float Contém um número de ponto flutuante com precisão de 7 dígitos. Precisão, anulável, opção
Edm.Guid Contém um identificador exclusivo de 16 bytes. Precisão, anulável, opção
Edm.Int16 Contém um valor inteiro de 16 bits com sinal. Precisão, anulável, opção
Edm.Int32 Contém um valor inteiro de 32 bits com sinal. Precisão, anulável, opção
Edm.Int64 Contém um valor inteiro de 64 bits com sinal. Precisão, anulável, opção
Edm.SByte Contém um valor inteiro de 8 bits com sinal. Precisão, anulável, opção
Edm.String Contém dados de caractere. Unicode, FixedLength, MaxLength, ordenação, precisão, anulável, opção
Edm.Time Contém uma hora. Precisão, anulável, opção
Edm.Geography Anulável, Padrão, SRID
Edm.GeographyPoint Anulável, Padrão, SRID
Edm.GeographyLineString Anulável, Padrão, SRID
Edm.GeographyPolygon Anulável, Padrão, SRID
Edm.GeographyMultiPoint Anulável, Padrão, SRID
Edm.GeographyMultiLineString Anulável, Padrão, SRID
Edm.GeographyMultiPolygon Anulável, Padrão, SRID
Edm.GeographyCollection Anulável, Padrão, SRID
Edm.Geometry Anulável, Padrão, SRID
Edm.GeometryPoint Anulável, Padrão, SRID
Edm.GeometryLineString Anulável, Padrão, SRID
Edm.GeometryPolygon Anulável, Padrão, SRID
Edm.GeometryMultiPoint Anulável, Padrão, SRID
Edm.GeometryMultiLineString Anulável, Padrão, SRID
Edm.GeometryMultiPolygon Anulável, Padrão, SRID
Edm.GeometryCollection Anulável, Padrão, SRID

Facetas (CSDL)

Facetas na linguagem de definição de esquema conceitual (CSDL) representam restrições em propriedades de tipos de entidade e tipos complexos. As facetas aparecem como atributos XML nos seguintes elementos CSDL:

  • Propriedade
  • TypeRef
  • Parâmetro

A tabela a seguir descreve as facetas com suporte no CSDL. Todas as facetas são opcionais. Algumas facetas listadas abaixo são usadas pelo Entity Framework ao gerar um banco de dados de um modelo conceitual.

Observação

Para obter informações sobre tipos de dados em um modelo conceitual, consulte CSDL (Tipos de Modelo Conceitual).

Faceta Descrição Aplica-se a Usado para a geração de banco de dados Usado pelo runtime
Ordenação Especifica a sequência de agrupamento (ou sequência de classificação) a ser usadas para executar a comparação e em ordenação operações em valores de propriedade. Edm.String Sim Não
ConcurrencyMode Indica que o valor da propriedade deve ser usado para verificação de simultaneidade otimista. Todas as propriedades EDMSimpleType Não Sim
Default Especifica o valor de propriedade padrão se nenhum valor é fornecido em cima de instanciação. Todas as propriedades EDMSimpleType Sim Yes
FixedLength Especifica se o comprimento do valor da propriedade pode variar. Edm.Binary, Edm.String Sim Não
MaxLength Especifica o comprimento máximo de valor de propriedade. Edm.Binary, Edm.String Sim Não
Permite valor nulo Especifica se a propriedade pode ter um valor nulo. Todas as propriedades EDMSimpleType Sim Yes
Precisão Para propriedades do tipo Decimal, especifica o número de dígitos que um valor de propriedade pode ter. Para propriedades do tipo Time, DateTime e DateTimeOffset, especifica o número de dígitos para a parte fracionária de segundos do valor da propriedade. Edm.DateTime, Edm.DateTimeOffset, Edm.Decimal, Edm.Time Sim Não
Escala Especifica o número de dígitos à direita do ponto decimal para o valor da propriedade. Edm.Decimal Sim Não
SRID Especifica a ID do sistema de referência do sistema espacial. Para obter mais informações, consulte SRID e SRID (SQL Server). Edm.Geography, Edm.GeographyPoint, Edm.GeographyLineString, Edm.GeographyPolygon, Edm.GeographyMultiPoint, Edm.GeographyMultiLineString, Edm.GeographyMultiPolygon, Edm.GeographyCollection, Edm.Geometry, Edm.GeometryPoint, Edm.GeometryLineString, Edm.GeometryPolygon, Edm.GeometryMultiPoint, Edm.GeometryMultiLineString, Edm.GeometryMultiPolygon, Edm.GeometryCollection Não Sim
Unicode Indica se o valor da propriedade é armazenado como Unicode. Edm.String Sim Yes

Observação

Ao gerar um banco de dados de um modelo conceitual, o Assistente para Gerar Banco de Dados reconhecerá o valor do atributo StoreGeneratedPattern em um elemento Property se ele estiver no namespace a seguir: https://schemas.microsoft.com/ado/2009/02/edm/annotation. Os valores com suporte para o atributo são Identidade e Computação. Um valor de Identidade produzirá uma coluna de banco de dados com um valor de identidade gerado no banco de dados. Um valor Computed produzirá uma coluna com um valor computado no banco de dados.

Exemplo

O exemplo a seguir mostra facetas aplicadas às propriedades de um tipo de entidade:

 <EntityType Name="Product">
   <Key>
     <PropertyRef Name="ProductId" />
   </Key>
   <Property Type="Int32"
             Name="ProductId" Nullable="false"
             a:StoreGeneratedPattern="Identity"
    xmlns:a="https://schemas.microsoft.com/ado/2009/02/edm/annotation" />
   <Property Type="String"
             Name="ProductName"
             Nullable="false"
             MaxLength="50" />
   <Property Type="String"
             Name="Location"
             Nullable="true"
             MaxLength="25" />
 </EntityType>