none
Mapemanento 1:N Entity Framework 4.1 Code-First e Banco Pré-Existente RRS feed

  • Pergunta

  • Boa tarde.

    Estou iniciando como EF 4.1/Code-First para mapeamento das minhas entidades em uma base de dados pré-existente, e surgiu a seguinte dúvida: Em relacionamentos de 1:N sou obrigado a acrescentar uma propriedade para maper a FK do banco para permitir a navegação das classes?

    Por exemplo: Para ilustrar minha dúvida, vamos imaginar duas entidades: "Blog" e "Post".  Um Blog possui um conjunto de Posts, e um Post sempre deve estar associado a um Blog. (obs: simplifiquei o modelo para focar apenas na minha dúvida).

    Com isso, teríamos a seguinte estrutura de dados:

    create table tb_Blog
    (
    	id_blog int primary key identity,
    	dc_blog varchar(1000) not null
    )
    
    create table tb_Post
    (
    	id_post int primary key identity,
    	id_blog int not null references tb_Blog(id_blog),
    	dt_post datetime not null
    )
    


    Para o modelo de classes, teríamos o seguinte cenário:

     public class Blog
     {
      public int? Id { get; set; }
      public string Descricao { get; set; }
    
      public virtual ICollection<Post> Posts { get; set; }
     }
    
     public class Post
     {
      public int? Id { get; set; }
      public DateTime DataPostagem { get; set; }
      
      public virtual Blog Blog { get; set; }
      public virtual int BlogId { get; set; }
     }


     Utilizando as minha classes de domínio para mapeamento, cheguei a uma configuração deste tipo: 

    public class BlogConfiguracao : EntityTypeConfiguration<Blog>
     {
    
    
      public BlogConfiguracao()
       : base()
      {
       HasKey(p => p.Id);
       Property(p => p.Id).HasColumnName("id_blog").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
       Property(p => p.Descricao).HasColumnName("dc_blog").IsRequired();
       ToTable("tb_Blog");
    
      }
    
    
    
      public PostConfiguracao()
       : base()
      {
       HasKey(p => p.Id);
       Property(p => p.Id).HasColumnName("id_post").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
       Property(p => p.DataPostagem).HasColumnName("dt_post").IsRequired();
    
       Property(p => p.BlogId).HasColumnName("id_blog").IsRequired();
       HasRequired(p => p.Blog).WithMany(p => p.Posts).HasForeignKey(k=>k.BlogId);
          
       ToTable("tb_Post");
    
      }
    
    

    Ou seja, na minha classe de domínio "Post" fui obrigado a incluir a propriedade "BlogId" e mapeá-la na FK da tabela tb_Post, para então  conseguir mapear a navegação da lista de Posts em Blog. Do ponto de vista de modelagem OO essa propriedade "BlogId" não deveria existir (na minha humilde opinião). 

    Pergunta: Existe alguma forma de declarar esses mapeamentos sem a utilização destes artifícios?

    Agradeço antecipadamente,

    Alessandro Antonio de Brito.
     

     

     

     


    Alessandro Brito
    quarta-feira, 31 de agosto de 2011 18:45

Todas as Respostas

  • Olá Alessandro,

    Como sua tabela já existia vc realmente precisa fazer esse mapeamento.

    Se sua tabela não existisse, e fosse criada pelo EF4.1., a engine do EF faria o mapeamento utilizando as convenções nativas do EF.

    Mas, como seu banco já existia, então realmente é necessário esse mapeamento.

    []s!

     


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    terça-feira, 13 de dezembro de 2011 11:22
    Moderador