Entity Framework - Bağlantısı Kesilen Varlıklar

Bu bölümde, bir bağlam tarafından izlenmeyen varlıklarda nasıl değişiklik yapılacağına bakalım. Bir bağlam tarafından izlenmeyen varlıklar, 'bağlantısı kesilmiş' varlıklar olarak bilinir.

  • Kullanıcı arabirimi ve veritabanı erişim katmanlarının aynı uygulama sürecinde çalıştığı çoğu tek katmanlı uygulama için, muhtemelen yalnızca bir bağlam tarafından izlenen varlıklar üzerinde işlemler gerçekleştiriyor olacaksınız.

  • Bağlantısı kesilen varlıklar üzerindeki işlemler, N-Katman uygulamalarında çok daha yaygındır.

  • N-Katmanlı uygulamalar, bir sunucudaki bazı verileri getirmeyi ve ağ üzerinden bir istemci makineye geri göndermeyi içerir.

  • İstemci uygulaması daha sonra bu verileri kalıcı olması için sunucuya geri göndermeden önce işler.

Bağlantısız varlık grafiği veya hatta tek bir bağlantısı kesilmiş varlık ile atılması gereken iki adım aşağıdadır.

  • Varlıkları yeni bağlam örneğiyle ekleyin ve bu varlıklar hakkında bağlamı bilinçlendirin.

  • Uygun EntityStates'i bu varlıklara manuel olarak ayarlayın.

Öğrenci varlığının iki Enrollment varlığıyla eklendiği aşağıdaki koda bir göz atalım.

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();
      }
   } 
}
  • Kod, Kayıtlar özelliğinde iki yeni Kayıt örneğine de başvuran yeni bir Öğrenci örneği oluşturur.

  • Daha sonra yeni Öğrenci, Add yöntemi kullanılarak bir bağlama eklenir.

  • Öğrenci eklendikten sonra, kod, Entity Framework'ün yeni Öğrenci hakkında sahip olduğu değişiklik izleme bilgilerine erişmek için DbContext.Entry yöntemini kullanır.

  • Bu değişiklik izleme bilgisinden, State özelliği, varlığın mevcut durumunu yazmak için kullanılır.

  • Bu süreç daha sonra yeni Öğrenci'den referans alınan yeni oluşturulan Kayıtların her biri için tekrarlanır. Uygulamayı çalıştırırsanız, aşağıdaki çıktıyı alırsınız -

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

Entity Framework'e yeni varlıklar hakkında bilgi vermek için DbSet.Add kullanılırken, DbSet.Attach Entity Framework'e var olan varlıklar hakkında bilgi vermek için kullanılır. Attach yöntemi, Değiştirilmemiş durumdaki bir varlığı işaretleyecektir.

DbContext ile bağlantısı kesilmiş bir varlığın eklendiği aşağıdaki C # koduna bir göz atalım.

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();
      }
   }
}

Yukarıdaki kod Attach () metodu ile çalıştırıldığında aşağıdaki çıktıyı alacaksınız.

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