A maior rede de estudos do Brasil

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

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

Excluindo uma propriedade no mapeamento
InverseProperty
Considere as seguintes entidades.
www.facebook.com/k19treinamentos 53
ENTITY FRAMEWORK 54
1 public class Pessoa
2 {
3 public int PessoaID { get; set; }
4
5 public string Nome { get; set; }
6
7 public ICollection <Livro > LivrosPublicados { get; set; }
8
9 public ICollection <Livro > LivrosRevisados { get; set; }
10 }
Código C# 3.38: Pessoa.cs
1 public class Livro
2 {
3 public int LivroID { get; set; }
4
5 public string Titulo { get; set; }
6
7 public Pessoa Autor { get; set; }
8
9 public Pessoa Revisor { get; set; }
10 }
Código C# 3.39: Livro.cs
Nesse caso, como o Entity Framework não consegue combinar as propriedades das duas entida-
des para estabelecer dois relacionamentos bidirecionais, ele criará no banco de dados quatro chaves
estrangeiras, uma para cada propriedade de navegação das entidades Pessoa e Livro.
Figura 3.18: Relacionamentos não combinados
Para agrupar as propriedades de navegação das entidades Pessoa e Livro, devemos utilizar a
anotação InverseProperty. Observe o código a seguir.
1 public class Pessoa
2 {
3 public int PessoaID { get; set; }
4
5 public string Nome { get; set; }
6
7 [InverseProperty("Autor")]
8 public ICollection <Livro > LivrosPublicados { get; set; }
9
10 [InverseProperty("Revisor")]
11 public ICollection <Livro > LivrosRevisados { get; set; }
12 }
Código C# 3.40: Pessoa.cs
1 public class Livro
54 www.k19.com.br
55 ENTITY FRAMEWORK
2 {
3 public int LivroID { get; set; }
4
5 public string Titulo { get; set; }
6
7 public Pessoa Autor { get; set; }
8
9 public Pessoa Revisor { get; set; }
10 }
Código C# 3.41: Livro.cs
Figura 3.19: Relacionamentos combinados com InverseProperty
Exercícios de Fixação
10 Altere a classe Aluno do projeto K19EntityFramework.
1 namespace K19EntityFramework
2 {
3 [Table("tbl_alunos")]
4 public class Aluno
5 {
6 public int AlunoID { get; set; }
7
8 [Required]
9 public string Nome { get; set; }
10
11 public Endereco Endereco { get; set; }
12 }
13 }
Código C# 3.42: Aluno.cs
11 Apague a base de dados K19EntityFramework.K19Context e execute novamente o projeto. Ob-
serve as modificações na estrutura da tabela Alunoes que passará a se chamar tbl_alunos. Observe
que agora a coluna Nome não pode possuir valores nulos.
Gerenciamento de entidades
As instâncias das entidades de uma aplicação que utiliza o Entity Framework são administradas
por objetos do tipo DbContext. Esses objetos são responsáveis pelas operações de inserção, remoção,
alteração e consulta. A seguir, mostraremos o funcionamento básico de um DbContext.
www.facebook.com/k19treinamentos 55
ENTITY FRAMEWORK 56
A primeira regra básica sobre os DbContexts é sempre utilizá-los dentro de um bloco using para
evitar que os recursos utilizados por eles não sejam devidamente fechados.
1 using (var context = new K19Context ())
2 {
3 // utilizando o DbContext
4 }
Código C# 3.43: Utilizando um DbContext dentro do bloco using
Persistindo
Para indicar que determinado objeto deve ser persistido no banco de dados, devemos utilizar
o método System.Data.Entity.DbSet.Add(), passando o objeto em questão como parâmetro. O
método Add() adiciona o objeto ao contexto com o estado Added.
Para armazenar de fato as informações de um objeto no banco de dados, utilizamos o método
SaveChanges() do DbContext. Todos os objetos do contexto que estejam no estado Added são inse-
ridos no banco de dados quando o método SaveChanges() é chamado.
1 Editora editora = new Editora { Nome = "K19", Email = "contato@k19.com.br" };
2
3 // Adiciona a editora criada ao contexto com estado Added
4 context.Editoras.Add(editora);
5
6 // Sincroniza o contexto com o banco de dados
7 context.SaveChanges ();
Código C# 3.44: Persistindo um objeto
Buscando
Para obter um objeto que contenha informações do banco de dados, basta utilizar o método
Find() do DbSet. Devemos passar o identificador do objeto que desejamos recuperar como parâ-
metro para esse método.
1 Editora editora = context.Editoras.Find (1);
Código C# 3.45: Buscando uma editora com o identificador 1
Removendo
Para indicar que determinado objeto deve ser removido, basta utilizar o método System.Da-
ta.Entity.DbSet.Remove(). Esse método marca o objeto para ser removido do banco de dados,
colocando-o no estado Deleted.
Quando o método SaveChanges() é chamado, todas os objetos no estado Deleted são removidos
do banco de dados.
1 Editora editora = context.Editoras.Find (1);
2
3 // Marca a editora que deve ser removida
4 context.Editoras.Remove(editora);
5
6 // Sincroniza o contexto com o banco de dados
7 context.SaveChanges ();
56 www.k19.com.br
57 ENTITY FRAMEWORK
Código C# 3.46: Removendo uma editora do banco de dados
Atualizando
Para alterar os dados do registro correspondente a um objeto, basta modificar as suas proprieda-
des. Quando as propriedades de um objeto do contexto são alteradas, o estado Modified é associado
a este objeto. Objetos no estado Modified são atualizados no banco de dados quando o método
SaveChanges() é chamado.
1 Editora editora = context.Editoras.Find (1);
2
3 // Modificando as propriedades de um objeto
4 editora.Nome = "Abril S/A";
5
6 // Sincroniza o contexto com o banco de dados
7 context.SaveChanges ();
Código C# 3.47: Alterando o nome de uma editora
Listando
Para obter uma listagem com todos os objetos referentes aos registros de uma tabela, podemos
utilizar a Language Integrated Query (LINQ), que nos permite escrever consultas dentro do código
C#.
1 var consulta = from e in context.Editoras
2 where e.Nome.Contains("A")
3 select e;
4
5 // Equivalente a: SELECT * FROM Editoras e where e.Nome Like ’A%’
6 foreach (var item in consulta)
7 {
8 System.Console.WriteLine("Editora: " + item.Nome);
9 }
Código C# 3.48: Utilizando LINQ para fazer uma consulta
Exercícios de Fixação
12 Adicione uma classe no projeto K19EntityFramework chamada InsereAluno.
1 namespace K19EntityFramework
2 {
3 public class InsereAluno
4 {
5 static void Main(string [] args)
6 {
7 using (var ctx = new K19Context ())
8 {
9 Console.WriteLine("Digite o nome do aluno");
10 string nome = Console.ReadLine ();
11
12 Console.WriteLine("Digite o logradouro do endereço do aluno");
13 string logradouro = Console.ReadLine ();
14
www.facebook.com/k19treinamentos 57
ENTITY FRAMEWORK 58
15 Console.WriteLine("Digite o número do endereço do aluno");
16 int numero = Int32.Parse(Console.ReadLine ());
17
18 Console.WriteLine("Digite o CEP do endereço do aluno");
19 string cep = Console.ReadLine ();
20
21 Aluno a = new Aluno
22 {
23 Nome = nome ,
24 Endereco = new Endereco
25 {
26 Logradouro = logradouro ,
27 Numero = numero ,
28 CEP = cep
29 }
30 };
31
32 ctx.Alunos.Add(a);
33 ctx.SaveChanges ();
34 }
35
36 }
37 }
38 }
Código C# 3.49: InsereAluno.cs
Nas propriedades do projeto K19EntityFramework, altere o statup object selecionando a classe
InsereAluno. Depois execute o projeto.
13 Adicione uma classe no projeto K19EntityFramework chamada ListaAluno.
1 using System.Linq;
2 namespace K19EntityFramework
3 {
4 public class ListaAluno
5 {
6 static void Main(string [] args)
7 {
8 using (var ctx = new K19Context ())
9 {
10 var consulta = from a in ctx.Alunos select a;
11
12 foreach (Aluno a in consulta)
13 {
14 Console.WriteLine("Nome: " + a.Nome);
15 Console.WriteLine("Logradouro: " + a.Endereco.Logradouro);
16 Console.WriteLine("Número: " + a.Endereco.Numero);
17 Console.WriteLine("CEP: " + a.Endereco.CEP);
18 Console.WriteLine("-----------------------------");
19 }
20 }
21 }
22 }
23 }
Código C# 3.50: ListaAluno.cs
Nas propriedades do projeto K19EntityFramework, altere o statup object selecionando a classe
ListaAluno. Depois execute o projeto.
14 Adicione uma classe no projeto