08_EntityFramework e DatabaseFirst

O objectivo da EntityFramework é o de aumentar a produtividade do programador, reduzindo tarefas redundantes para persistência de dados

Existem várias forma de especificar o modelo de dados:
Database First (Bd -> classes de domínio)
CodeFirst (classes de dominio -> Bd)
ModelFirst (UML e surgem as classes de dominio via EF e a base de dados)

O contexto (Model.Contex.cs):
Contem a classe que deriva da classe DbContext
Fornece a propriedade para cada classe do modelo que corresponde a tabela da BD (Fornecedor.cs Cliente.cs)

Os modelos:
os modelos representam as tabelas da base de dados
quando pretendemos usar o “maldito” scaffolding, recorremos à classe de contexto e ao modelo de classes

o Linq e a EntityFramework:
o Lazy Loading: o loading não é executado de forma imediata, é apenas quando se acede aos elementos (bom apenas para aplicações desktop)

Problema do n+1 do lazy loading:
fazer uso de inlcude

Alternativa ao lazy loading, é o explicit loading:
útil quando se pretende efectuar o load de muitos objectos e as queries ficam complexas (as queries são separadas), mas faz muitas queries na base de dados
ou o Eager loading:
quando se obtém os dados da BD em apenas um round-trip e faz uso de joins

Como adicionar objectos na BD:

//v1
var aluno = new Aluno { Nome = "Pedro",
UserName="pedro@residual.ptt",
Email ="pedro@residual.pt",
CursoId=1
};
db.Alunos.Add(aluno);
db.SaveChanges();

ou

//v2
var cursos = db.Cursos.ToList();
var curso = db.Cursos.Single(c => c.CursoId == 1);
var aluno = new Aluno { Nome = "Pedro",
UserName="pedro@residual.pt",
Email ="pedro@residual.pt",
Curso = curso
};
db.Alunos.Add(aluno);
db.SaveChanges();

Como alterar objectos na BD:

var curso = db.Cursos.Find(4); // ou var curso = db.Cursos.Single(c => c.CursoId == 4);
curso.Objectivos = "Curso bla bla bla";
curso.Nome = "Novo Nome";
db.SaveChanges();

Como remover objectos na BD:

//Com CascadeDelete ativo
var curso = db.Cursos.Find(4);
db.Cursos.Remove(curso);
db.SaveChanges();

Ou

//Sem CascadeDelete ativo
var curso = db.Cursos.Include(c => c.Alunos)
.Single(c => c.CursoId == 4);
db.Alunos.RemoveRange(curso.Alunos);
db.Cursos.Remove(curso);
db.SaveChanges();
Tags : ,