Entity Framework - entidades desconectadas

Neste capítulo, vamos ver como fazer alterações em entidades que não estão sendo rastreadas por um contexto. As entidades que não estão sendo rastreadas por um contexto são conhecidas como entidades 'desconectadas'.

  • Para a maioria dos aplicativos de camada única, onde a interface do usuário e as camadas de acesso ao banco de dados são executadas no mesmo processo do aplicativo, você provavelmente executará apenas operações em entidades que estão sendo rastreadas por um contexto.

  • As operações em entidades desconectadas são muito mais comuns em aplicativos N-Tier.

  • Os aplicativos N-Tier envolvem buscar alguns dados em um servidor e devolvê-los, pela rede, a uma máquina cliente.

  • O aplicativo cliente então manipula esses dados antes de retorná-los ao servidor para serem persistidos.

A seguir estão as duas etapas que precisam ser realizadas com o gráfico de entidade desconectada ou até mesmo uma única entidade desconectada.

  • Anexe entidades com a nova instância de contexto e torne o contexto ciente dessas entidades.

  • Defina EntityStates apropriados para essas entidades manualmente.

Vamos dar uma olhada no código a seguir, no qual a entidade Student é adicionada a duas entidades Enrollment.

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram", 

         EnrollmentDate = DateTime.Parse("2015-10-10"), 
            Enrollments = new List<Enrollment> {

               new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 },
               new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 },
         }
      };

      using (var context = new UniContextEntities()) {

         context.Students.Add(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", 
               enrollment.EnrollmentID, context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   } 
}
  • O código constrói uma nova instância Student, que também faz referência a duas novas instâncias Enrollment em sua propriedade Enrollments.

  • Em seguida, o novo aluno é adicionado a um contexto usando o método Add.

  • Depois que o aluno é adicionado, o código usa o método DbContext.Entry para obter acesso às informações de controle de alterações que o Entity Framework tem sobre o novo aluno.

  • A partir dessas informações de controle de alterações, a propriedade State é usada para gravar o estado atual da entidade.

  • Este processo é então repetido para cada uma das Matrículas recém-criadas que são referenciadas pelo novo Aluno. Se você executar o aplicativo, receberá a seguinte saída -

New Student   (Wasim  Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...

Enquanto DbSet.Add é usado para informar ao Entity Framework sobre novas entidades, DbSet.Attach é usado para informar ao Entity Framework sobre entidades existentes. O método Attach marcará uma entidade no estado Inalterado.

Vamos dar uma olhada no código C # a seguir, no qual uma entidade desconectada é anexada ao DbContext.

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram",
         EnrollmentDate = DateTime.Parse("2015-10-10"), 

         Enrollments = new List<Enrollment> {
            new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 },
            new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 },
         }
			
      };

      using (var context = new UniContextEntities()) {

         context.Students.Attach(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID, 
               context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   }
}

Quando o código acima é executado com o método Attach (), você receberá a seguinte saída.

New Student   (Wasim  Akram): Unchanged
Enrollment ID: 2001 State: Unchanged
Enrollment ID: 2002 State: Unchanged
Press any key to exit...