none
Mapear nome classe com o nome de tabela usando o EF 4.0 com POCO RRS feed

  • Pergunta

  • Bom dia pessoal!

     

    Eu estou um pequeno problema que não estou achando uma solução fácil, vamos ao problema.

    Estou iniciando uma aplicação que vai utilizar PostgreSQL com a possibilidade de usar outros bancos de dados (Sql Server, Oracle...), então decidi por utilizar o Entity Framework que me da a flexibilidade de trocar de banco sem ter o impacto na minha aplicação tão grande. E também decidi utilizar  o conceito de POCO do EF 4.0 diminuindo assim as minhas classes de VO.

    Depois de muita pesquisa e leitura eu finalmente estou conseguindo realizar todas as operações no meu banco Postgre, porém tive um problema com a minha classe modelo que tem que seguir mesma nomenclatura do banco de dados, e como sabemos cada banco tem uma forma de trabalhar nomenclatura de objetos, exemplo o oracle é case sensitive enquanto o sql server não é.

    Ai vai então a pergunta, tem como eu realizar o mapeamento do nome da classe e suas propriedades utilizando alguma propriedade ou coisa assim? Eu encontrei um exemplo na internet que fala para alterar o arquivos gerado pelo mapeamento porém isso não é interessante porque quando eu precisar realizar uma atualização na base e regerar o arquivo vou ter que refazer todo o mapeamento.

    Se alguém souber de uma solução agradeço o post.

    quinta-feira, 21 de abril de 2011 14:37

Todas as Respostas

  • Ola,

    Não tem muito segredo... se quiser é possivel alterar o mapeamento das tabelas diretamente no arquivo edmx que é um xml....

    Segue um exemplo onde no banco de dados as tabelas se chamam 'Usuarios" e "Rotinas" mas as entidades se chamam "Users" e "Roles"

      <edmx:Mappings>
       <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="SECETModelStoreContainer" CdmEntityContainer="SECETEntities">
         <EntitySetMapping Name="Rotinas"><EntityTypeMapping TypeName="SECETModel.Roles"><MappingFragment StoreEntitySet="Rotinas">
          <ScalarProperty Name="Nome" ColumnName="Nome" />
          <ScalarProperty Name="Modulo" ColumnName="Modulo" />
          <ScalarProperty Name="Inclusao" ColumnName="Inclusao" />
          <ScalarProperty Name="Alteracao" ColumnName="Alteracao" />
          <ScalarProperty Name="Consulta" ColumnName="Consulta" />
          <ScalarProperty Name="Pesquisa" ColumnName="Pesquisa" />
          <ScalarProperty Name="Impressao" ColumnName="Impressao" />
          <ScalarProperty Name="Exclusao" ColumnName="Exclusao" />
         </MappingFragment></EntityTypeMapping></EntitySetMapping>
         <EntitySetMapping Name="Usuarios"><EntityTypeMapping TypeName="SECETModel.Users"><MappingFragment StoreEntitySet="Usuarios">
          <ScalarProperty Name="Nome" ColumnName="Nome" />
          <ScalarProperty Name="Senha" ColumnName="Senha" />
          <ScalarProperty Name="NomeCompleto" ColumnName="NomeCompleto" />
         </MappingFragment></EntityTypeMapping></EntitySetMapping>
        </EntityContainerMapping>
       </Mapping>
      </edmx:Mappings>
    

    quinta-feira, 21 de abril de 2011 19:21
    Moderador
  • Boa noite Rui!

    Obrigado pela resposta!

    Essa solução eu já tinha encontrado, porém a alteração do arquivo edmx, que no meu casso nem tenho esse arquivo pois eu realizo o mapeamento utilizando o edmgen que me retorna três arquivos um csdl, msl e outro ssdl mais dois arquivos .cs que o as classes geradas.

    Essa forma de alterar o arquivo me gera um pequeno problema, toda vez que eu precisar realizar uma alteração banco eu vou ter que regerar o arquivo, o que vai ocasionar na perca das minas alterações, e isso implica em refazer novamente o mapeamento. Então  o que eu quero é na hora de gerar a minha classe na classe que herda de ObjectContext eu fale que a classe "A" deve ser carregada mapeando a entidade "B" pois assim mesmo quando eu realizar alguma alteração no banco eu vou continuar com o meu mapeamento.

     

    sexta-feira, 22 de abril de 2011 02:11
  • Ola... na verdade a solução é a mesma... so que no seu caso as configurações de mapeamento ficam no arquivo .msl...

    a ideia é ter um arquivo .msl para cada banco de dados... algo como .. Repositorio.oracle.msl, Repositorio.mssql.msl, etc.... lembrando que se vc fizer alguma alteração na estrutura de dados.. tera que atualizar todos os arquivos msl...

    Uma vez configurado isso... vc pode atraves de uma diretiva definir qual arquivo usar na hora de compilar o seu sistema... por exemplo vc pode criar uma diretiva de compilação:

    Release (Oracle), Release (MSSQL) etc...

    Para fazer isso basta ir no "Configuration Manager", criar as configurações novas... 

    Feito isso... em "Build Events" vc configura no "Pre-build event command line" para copiar o arquivo Repositorio.{diretiva}.msl para o arquivo Repositorio.msl...

    ex:

    if $(ConfigurationName) == Release (Oracle) xcopy $(ProjectDir)\Repositorio.oracle.msl $(ProjectDir)\Repositorio.msl
    if $(ConfigurationName) == Release (MSSQL) xcopy $(ProjectDir)\Repositorio.mssql.msl $(ProjectDir)\Repositorio.msl

    Desta forma, conforme a configuração q vc definir para compilar... ele ira usar a configuração definida no seu arquivo .msl personalisado...

    segunda-feira, 25 de abril de 2011 22:41
    Moderador
  • Bom dia Rui!

     

    Acho que essa abordagem terá os resultados que eu estou esperando. Como tinha que andar com a aplicação eu acabei criando o banco no SQL Server mesmo e fui adiantando as coisas, vou modificar o meu arquivo msl e vou realizar os teste, posto uma resposta em breve.

     

    Obrigado pela ajuda!

    quarta-feira, 4 de maio de 2011 12:18
  • Bom dia Rui!

     

    Acho que essa abordagem terá os resultados que eu estou esperando. Como tinha que andar com a aplicação eu acabei criando o banco no SQL Server mesmo e fui adiantando as coisas, vou modificar o meu arquivo msl e vou realizar os teste, posto uma resposta em breve.

     

    Obrigado pela ajuda!


    Beleza, qualquer duvida é so dar um toque... estamos no aguardo
    quarta-feira, 4 de maio de 2011 12:29
    Moderador