Entity Framework - Persistência
O Entity Framework agora permite que você se beneficie do Entity Framework sem forçar todas as partes do seu aplicativo a conhecer o Entity Framework, separando as entidades da infraestrutura. Você pode criar classes que podem se concentrar em suas regras de negócios, independentemente de como são persistentes (onde os dados são armazenados e como os dados vão e vêm entre seus objetos).
Criação de entidades ignorantes persistentes
O parágrafo anterior descreveu um método que não tem conhecimento íntimo da fonte dos dados que consome. Isso destaca a essência da ignorância da persistência, que ocorre quando suas classes e muitas de nossas camadas de aplicativos em torno delas não se importam como os dados são armazenados.
Na versão .NET 3.5 do Entity Framework, se você quisesse usar classes preexistentes, era necessário modificá-las, forçando-as a derivar de EntityObject.
No .NET 4, isso não é mais necessário. Você não precisa modificar suas entidades para que participem das operações do Entity Framework.
Isso nos permite construir aplicativos que adotam o acoplamento fraco e a separação de interesses.
Com esses padrões de codificação, suas classes estão preocupadas apenas com seus próprios trabalhos e, muitas camadas de seu aplicativo, incluindo a IU, não têm dependências de lógica externa, como as APIs do Entity Framework, embora essas APIs externas sejam capazes de interagir com nossos entidades.
Existem 2 formas (conectado e desconectado) ao persistir uma entidade com o Entity Framework. Ambas as formas têm sua própria importância. No caso de um cenário conectado, as mudanças são rastreadas pelo contexto, mas no caso de um cenário desconectado, precisamos informar o contexto sobre o estado da entidade.
Cenários Conectados
O cenário conectado é quando uma entidade é recuperada do banco de dados e modificada no mesmo contexto. Para um cenário conectado, vamos supor que temos um serviço Windows e estamos fazendo algumas operações de negócios com essa entidade, então vamos abrir o contexto, percorrer todas as entidades, fazer nossas operações de negócios e salvar as alterações com o mesmo contexto que nós abriu no início.
Vamos dar uma olhada no exemplo a seguir, no qual os alunos são recuperados do banco de dados e atualizam o primeiro nome dos alunos e, em seguida, salvam as alterações no banco de dados.
class Program {
static void Main(string[] args) {
using (var context = new MyContext()) {
var studentList = context.Students.ToList();
foreach (var stdnt in studentList) {
stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
}
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
Quando o código acima for compilado e executado, você receberá a seguinte saída e verá que a palavra editada é anexada antes do primeiro nome, conforme mostrado na seguinte saída.
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Mark Upston
Cenários desconectados
O cenário desconectado é quando uma entidade é recuperada do banco de dados e modificada em um contexto diferente. Vamos supor que queremos exibir alguns dados em uma camada de apresentação e estamos usando algum aplicativo de n camadas, portanto, seria melhor abrir o contexto, buscar os dados e finalmente fechar o contexto. Como aqui buscamos os dados e fechamos o contexto, as entidades que buscamos não são mais rastreadas e este é o cenário desconectado.
Vamos dar uma olhada no código a seguir, no qual uma nova entidade de aluno desconectada é adicionada a um contexto usando o método Add.
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
};
using (var context = new MyContext()) {
context.Students.Add(student);
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
Quando o código acima for compilado e executado, você receberá a seguinte saída.
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram