Mapemanento 1:N Entity Framework 4.1 Code-First e Banco Pré-Existente
-
quarta-feira, 31 de agosto de 2011 18:45
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
Todas as Respostas
-
terça-feira, 13 de dezembro de 2011 11:22Moderador
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

