Pergunta POCO + Entity Framework com DDD

  • sábado, 7 de abril de 2012 05:32
     
     

    Olá pessoal, 

    Eu estou estudando POCO do entity framework, mas estou enfrentando muitos problemas.
    Segui recomendações do Olavo em um post anterior, mas estou estudando também em base de um vídeo do Giuliano Bassi que eu vi sobre DDD com Entity Framework e POCO.

    Vamos la,

    1. Eu criei uma solução em branco.
    2. Criei 3 projetos sendo:
    - Modelo.Dominio (Fica minhas classes(entidades).
    - Modelo.Infra (Fica meu edmx e o Contexto do POCO).
    - Modelo.UI

    Na minha camada de Dominio, criei uma pasta chamada "Entidades" a qual nelas eu criei 2 classes: "Produto" e "ProdutoCategoria".

    Na classe Produto ficou assim:

    public int Id { get; set; }
    public string Nome { get; set; }
    public bool Ativo { get; set; }


    Na classe Categoria ficou assim:

    public int Id { get; set; }
    public int IdImovel { get; set; }
    public string Nome { get; set; }

    Após a criação das classes, na camada de Infra, eu crio uma pasta chamada "Persistencia" a qual eu crio um Entity Data Model(Meu edmx) e nela eu coloco para gerar as classes vindas de acordo com o banco.

    Quero ressaltar que o banco está com as mesmas propriedades e nomes das classes criadas na camada de Dominio.

    Bom, feito isto eu também desativo o code generation do meu edmx, pois eu vou utilizar em base das minhas classes POCOS.

    Após isto, eu clico com o botão direito do mouse no fundo do meu edmx e escolho o "Add code generation item..." e escolho o POCO, nomeando para Modelo.tt

    Depois eu apago as classes que ele já mapeia e coloco o using da minha camada de Dominio para que as classes sejam as que eu criei na pasta Entidade.

    Feito isto, eu faço todo o processo no MVC criando minha Model, Controller e View para renderizar. Não vou detalhar esta etapa, pois o ponto do problema ocorre nas outras camadas.

    Bom, quando eu executado minha aplicação eu recebo a seguinda exception:

    Mapping and metadata information could not be found for EntityType 'Modelo.Dominio.Entidades.Produto'.

    Procurando na internet, eu descobri que este erro ocorre quando alguma propriedade entre minha classe está diferente do meu edmx, exemplo, tipo string ou até mesmo uma letra "Id" para "ID".

    Eu tentei e não achei qualquer erro com estes detalhes.
    Eu fiz um teste e apaguei a tabela ProdutoCategoria do banco, do edmx e da minha classe.

    E veja, funcionou nomalmente.
    Eu acredito que este problema sefere a alguma associação(relacionamento) das minhas tabelas, algo que eu preciso configurar no edmx ou nas classes criadas na camada de Dominio. Eu não sei.

    Também tenho alguns outros prontos:

    - Prefiro criar minhas bases no banco do que usar o generate data base from model. Quando eu peço para o entity criar, ele não cria exatamente como eu quero, exemplo nomes das FK, tipos de decimal (18, 0), se permite nulo e etc, td eu preciso configurar nas propriedades. Por exemplo, se eu crio uma entidade do tipo decimal e quero setar (18, 2), onde eu devo configurar nas propriedades?

    - Me parece difícil a manutenção

    Eu devo estar fazendo algo erro.
    Abraços

Todas as Respostas

  • sábado, 7 de abril de 2012 23:09
     
     

    Primeiramente o nome dele é: Giovanni Bassi ;)

    Olha eu nunca gostei de usar o edmx, e usei poucas vezes. Hoje eu uso o Fluent API do EF, e acho que esse pode ser uma solução para o seu problema. http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx

    Como funciona o Fluent API do EF? Simples, você cria suas classes POCO, e depois cria uma outra classe que irá mapiar essas classes POCO para o Entity Framework. Assim ela te da um maior controle sobre o mapiamento e ainda liberdade para trabalhar com notações diferentes nas suas classes e nas tabelas do seu banco de dados.

    Pesquise sobre ele e sua implementação, ele se assemelha muito ao Fluent NHibernate.

    Abraços.

  • segunda-feira, 9 de abril de 2012 13:02
    Moderador
     
     

    Rodrigo, como você criou sua classe de relacionamento ? 

    uma coisa importante seria colocar todas as propriedades das suas entidades como Virtual

    Public Virtual String ALGUMACOISA{get;set;}


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Facebook Olavo Neto
    Linkedin Olavo Neto
    Se for útil marque como resposta e faça um Developer feliz :)

  • segunda-feira, 9 de abril de 2012 18:15
     
     
    Obrigado Igor, eu já vi o Fluent API, em uma vídeo aula do Renato Haddad também vlw
  • segunda-feira, 9 de abril de 2012 18:24
     
     

    Oi Olavo td bom?

    Então, nas vídeos aulas e tutoriais que estudei, eu notei que ao usar o POCO, você pode:
    Utilizar as próprias classes que ele cria pra vc ou você mesmo utilizar suas próprias classes colocando o using.

    O meu problema é que eu estava criando as propriedades de forma errada, tipo: No banco uma propriedade aceitava nulo, e eu não colocava na aplicação, ou n criava o relacionamento correto nas classes.

    Diante disto eu tenho dúvidas se realmente vale a pena.

    Gostaria de tirar estas dúvidas por favor :D

    - Achei muito difícil a manutenção ao utilizar minhas próprias classes
    - Achei mais fácil utilizar as próprias classes que o POCO gera na extensão .tt
    - Qual a diferença de eu utilizar somente o Entity Framework e suas entidades e criar minhas próprias classes como partial conforme minha necessidade ao invés de utilizar POCO?
    - Olavo, quando você utiliza POCO, você utiliza suas próprias classes ou utiliza as classes que o POCO gera?
    - Você utiliza DDD como arquitetura? eu ainda estou aprendendo, tenho muitas dúvidas ainda a respeito as responsabilidades de cada camada e sua responsabilidade. No projeto que estava fazendo deu referência circular. 

    Abraços