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