A maior rede de estudos do Brasil

Grátis
244 pág.
Desenvolvimento Web - MVC

Pré-visualização | Página 8 de 41

Security Info=true;
13 MultipleActiveResultSets=True" />
14 </connectionStrings >
15 </configuration >
Código XML 3.1: App.config
Quando o Entity Framework é instalado em um projeto do Visual Studio 2012, as configurações
padrão são inseridas explicitamente no arquivo de configuração da aplicação. Contudo, essas confi-
gurações são opcionais. Inclusive, podemos removê-las e mesmo assim elas serão aplicadas.
Convenções de Mapeamento
Por padrão, no Entity Framework, o mapeamento das entidades segue as regras do Code First.
Considere as entidades Livro e Editora definidas abaixo.
1 public class Livro
2 {
3 public int LivroID { get; set; }
4 public string Titulo { get; set; }
5 public decimal Preco { get; set; }
6 public Editora Editora { get; set; }
7 }
Código C# 3.1: Livro.cs
1 public class Editora
2 {
3 public int EditoraID { get; set; }
4 public string Nome { get; set; }
5 public string Email { get; set; }
6 public ICollection <Livro > Livros { get; set; }
7 }
Código C# 3.2: Editora.cs
As entidades devem ser “registradas” em um DbContext. Para registrar uma entidade, basta de-
finir uma propriedade do tipo DbSet. Veja o exemplo abaixo.
1 public namespace EF
2 {
3 public class K19Context : DbContext
www.facebook.com/k19treinamentos 41
ENTITY FRAMEWORK 42
4 {
5 public DbSet <Editora > Editoras { get; set; }
6 public DbSet <Livro > Livros { get; set; }
7 }
8 }
Código C# 3.3: K19Context.cs
De acordo com as convenções do Code First, as entidades Editora e Livro serão mapeadas
para tabelas chamadas Editoras e Livroes respectivamente. Observe que os nomes das entidades
foram pluralizados seguindo as regras da língua inglesa para definir os nomes das tabelas.
Além disso, por padrão, essas tabelas serão criadas em uma base de dados chamada EF.K19Context.
Esse nome corresponde ao full qualified name da classe K19Context.
Mais Sobre
Para desabilitar a pluralização aplicada no nome das tabelas, é necessário sobrescrever
o método OnModelCreating() da classe DbContext.
1 public class K19Context : DbContext
2 {
3 public DbSet <Editora > Editoras { get; set; }
4 public DbSet <Livro > Livros { get; set; }
5
6 protected override void OnModelCreating( DbModelBuilder dbModelBuilder)
7 {
8 dbModelBuilder.Conventions.Remove <PluralizingTableNameConvention >();
9 }
10 }
Código C# 3.4: K19Context.cs
Mais Sobre
Nas próximas versões do Entity Framework, as regras de pluralização poderão ser perso-
nalizadas. Dessa forma, será possível, por exemplo, substituir as regras da língua inglesa
pelas regras da língua portuguesa.
Mais Sobre
Podemos modificar o nome da base de dados escolhido por padrão. Para isso, basta
adicionar um construtor na classe que define o DbContext semelhante ao mostrado
no código abaixo.
1 public class K19Context : DbContext
2 {
3 public DbSet <Editora > Editoras { get; set; }
4 public DbSet <Livro > Livros { get; set; }
5
6 public K19Context () : base("MinhaBaseDeDados")
7 {
8 }
9 }
Código C# 3.5: K19Context.cs
42 www.k19.com.br
43 ENTITY FRAMEWORK
Primary Key
O Entity Framework assumirá como identificador de uma entidade, a propriedade cujo nome
seja ID ou EntidadeID escrito com letras maiúsculas e/ou minúsculas. Essa propriedade será mape-
ada para uma coluna definida no banco de dados como chave primária da tabela correspondente a
entidade. Veja os exemplos abaixo.
1 public class Livro
2 {
3 public int LivroID { get; set; }
4 }
Código C# 3.6: Livro.cs
1 public class Livro
2 {
3 public int ID { get; set; }
4 }
Código C# 3.7: Livro.cs
Se o tipo da propriedade utilizada como identificador de uma entidade for numérico, os valores
da coluna correspondente a essa propriedade serão gerados pelo banco de dados. Isso significa que,
no SQL Server, a coluna será definida com a opção Identity.
Complex Types
Considere a seguinte entidade.
1 public class Contato
2 {
3 public int ContatoID { get; set; }
4
5 public string LogradouroResidencial { get; set; }
6 public string LogradouroComercial { get; set; }
7
8 public string CEPResidencial { get; set; }
9 public string CEPComercial { get; set; }
10
11 public String BairroResidencial { get; set; }
12 public String BairroComercial { get; set; }
13 }
Código C# 3.8: Contato.cs
Do ponto de vista da modelagem orientada a objetos, deveríamos refatorar essa classe separando
as propriedades relacionadas aos endereços de um contato.
1 public class Contato
2 {
3 public int ContatoID { get; set; }
4
5 public Endereco EnderecoResidecial { get; set;}
6 public Endereco EnderecoComercial { get; set;}
7 }
Código C# 3.9: Contato.cs
1 public class Endereco
2 {
www.facebook.com/k19treinamentos 43
ENTITY FRAMEWORK 44
3 public string Logradouro { get; set;}
4 public string CEP { get; set;}
5 public string Bairro { get; set;}
6 }
Código C# 3.10: Endereco.cs
Como nenhuma propriedade da classe Endereco se enquadra nas convenções de Primary Key e
supondo que nenhuma propriedade tenha sido mapeada explicitamente para uma coluna definida
como chave primária, o Entity Framework assumirá que essa classe é um Complex Type. Além disso,
um Complex Type não pode referenciar uma entidade através de uma propriedade.
As classes Contato e Endereco serão mapeadas para uma única tabela chamada Contatoes. Essa
tabela possuirá a estrutura mostrada na imagem a seguir.
Figura 3.7: Mapeamento das classes Contato e Endereco
Mapeamento dos Relacionamentos
Considere as seguintes entidades.
1 public class Livro
2 {
3 public int LivroID { get; set; }
4
5 public Editora Editora { get; set; }
6 }
Código C# 3.11: Livro.cs
1 public class Editora
2 {
3 public int EditoraID { get; set; }
4 }
Código C# 3.12: Editora.cs
Essas duas entidades serão mapeadas para as tabelas Livroes e Editoras. Na tabela Livroes,
será adicionada uma chave estrangeira chamada Editora_EditoraID referenciado a chave primária
da tabela Editora. Observe na imagem abaixo a estrutura das tabelas.
44 www.k19.com.br
45 ENTITY FRAMEWORK
Figura 3.8: Mapeamento das entidades Livro e Editora
As mesmas tabelas seriam obtidas se o relacionamento fosse definido na entidade Editora ao
invés de ser definido na entidade Livro.
1 public class Livro
2 {
3 public int LivroID { get; set; }
4 }
Código C# 3.13: Livro.cs
1 public class Editora
2 {
3 public int EditoraID { get; set; }
4
5 public ICollection <Livro > Livros { get; set; }
6 }
Código C# 3.14: Editora.cs
Também obteríamos as mesmas tabelas se o relacionamento fosse definido em ambas entidades.
1 public class Livro
2 {
3 public int LivroID { get; set; }
4
5 public Editora Editora { get; set; }
6 }
Código C# 3.15: Livro.cs
1 public class Editora
2 {
3 public int EditoraID { get; set; }
4
5 public ICollection <Livro > Livros { get; set; }
6 }
Código C# 3.16: Editora.cs
Por outro lado, se na entidade Livro uma coleção de editoras for definida como propriedade e
de forma análoga uma coleção de livros for definida como propriedade na entidade Editora então
uma terceira tabela será criada no banco de dados para representar esse relacionamento “muitos
para muitos” (many to many).
1 public class Livro
2 {
www.facebook.com/k19treinamentos 45
ENTITY FRAMEWORK 46
3 public int LivroID { get; set; }
4
5 public ICollection <Editora > Editoras { get; set; }
6 }
Código C# 3.17: Livro.cs
1 public class Editora
2 {
3 public int EditoraID { get; set; }
4
5 public ICollection <Livro > Livros { get; set; }
6 }
Código C# 3.18: Editora.cs
Figura 3.9: Mapeamento das entidades Livro e Editora
Type Discovery
Quando duas entidades estão relacionadas, não é necessário que ambas sejam “registradas” no
DbContext. Apenas a entidade principal necessita ser registrada. Por exemplo, considere as seguin-
tes entidades.
1 public class Livro
2 {
3 public