2013-01-13 12 views
7

'da yeni bir çocuk oluşturur. Entity Framework POCO'yu bağlantısız (bağlam) modda kullanmak istiyorum. Benim senaryomda yeni bir Parent nesnesi oluşturuyorum ve varolan bir çocuk nesnesini ona eklemek ve daha sonra db'ye kaydetmek istiyorum.
Aşağıdaki kod, yeni bir Öğrenci kaydı kaydedilirken yeni bir Ders kaydı eklenmez, bunun yerine mevcut Ders kaydının yeni Öğrenci kaydına bağlı olmasını istiyorum.Entity Framework: varolan alt POCO'yu yeni Ana POCO'ya ekleyerek, DB

Ben nesneler bağlamdan kopuk olabilir ...

  • Entity Framework bunu nasıl. (yani, bir bağlamda sorgulandı ve sonra farklı bir bağlamda kaydedildi)
  • DB'den kaydettirdiğimde, alt kayıt defterine ekleyebilmem için, alt kayıtları DB'den yeniden sorgulamama gerek yok. Zaten belleğe bir nesne olarak sahip olduğumda db'ye ekstra yolculuk yapmaktan kaçınmak istiyorum.

Bu sayfa aşağıdaki kod bağlamları çapraz ilişkiler izin vermez http://entityframeworktutorial.net/EF4_EnvSetup.aspx#.UPMZ4m-UN9Y

class Program 
{ 
    static void Main(string[] args) 
    { 

     //get existing course from db as disconnected object 
     var course = Program.getCourse(); 

     //create new student 
     var stud = new Student(); 
     stud.StudentName = "bob"; 

     //assign existing course to the student 
     stud.Courses.Add(course); 

     //save student to db 
     using (SchoolDBEntities ctx = new SchoolDBEntities()) 
     { 
      ctx.Students.AddObject(stud); 
      ctx.SaveChanges(); 
     } 
    } 

    static Course getCourse() 
    { 
     Course returnCourse = null; 

     using (var ctx = new SchoolDBEntities()) 
     { 
      ctx.ContextOptions.LazyLoadingEnabled = false; 
      returnCourse = (from s in ctx.Courses 
          select s).SingleOrDefault(); 
     } 

     return returnCourse; 
    } 
} 

cevap

17

Bunu gerçekleştirmenin birkaç yolu vardır inanıyoruz.

ctx.Courses.Attach(course); 
burada

diğer bilgiler: http://msdn.microsoft.com/en-us/data/jj592676.aspx Eğer mevcut varlıkla çalıştıklarını, sizin bağlam

ctx.Entry(course).State = EntityState.Unchanged; 

Veya talimat: Bu doğrultuda, bu rota varlık yerine katma daha değişmez belirtebilirsiniz

DÜZENLEME

Çözümümden bazı çalışan örnekler var, beklediğim gibi çalıştığını doğruladım. Her durumda veritabanında Publisher kaydımız var ID = 2 ve Name = "Addison Wesley" (örnekle alakasız, ama sadece iyi bir ölçü için).

Yaklaşım 1 - takın kullanma yöntemi

using (var context = new Context()) 
{ 
    var book = new Book(); 
    book.Name = "Service Design Patterns";     
    book.Publisher = new Publisher() { Id = 2 }; // Only ID is required 
    context.Publishers.Attach(book.Publisher); 
    context.Books.Add(book); 
    context.SaveChanges(); 
} 

Yaklaşım 3 - - Ayar Yabancı anahtar değeri

using (var context = new Context()) 
{ 
    var book = new Book(); 
    book.Name = "Service Design Patterns"; 
    book.PublisherId = 2; 
    context.Books.Add(book); 
    context.SaveChanges(); 
} 
Varlık State

using (var context = new Context()) 
{ 
    var book = new Book(); 
    book.Name = "Service Design Patterns"; 
    book.Publisher = new Publisher() {Id = 2 }; // Only ID is required 
    context.Entry(book.Publisher).State = EntityState.Unchanged; 
    context.Books.Add(book); 
    context.SaveChanges(); 
} 

Yaklaşım 2 Ayar

public int PublisherId { get; set; } 
public Publisher Publisher { get; set; } 

Burada EF5'i Kod kullanıyorum: Bu son yaklaşım ekstra özellik Yayıncı Kimliği eklemek için gerekli çalışması için

, bu kongre auotmatically EF tarafından alınmayı "NavigationPropertyName + 'Id göre adlandırılmış olması gerekir Birincisi, ama POCO'ya çok benziyor.

+0

İkinci seçenek neredeyse çalışıyor, ancak "Nesne eklenemiyor çünkü nesne bağlamında zaten var." "ctx.Students.AddObject (stud)" hatası hat. Hala "stud.Courses.Add (course)" yaparken bunu yapamayacağımı farz ediyorum. ondan önce . Yine de stud koleksiyonundaki Dersler koleksiyonundan yararlanmak istiyorum. – MakkyNZ

+0

Eh, bunu test etmek için kullanışlı bir çözümüm yok, ancak önce bunu eklemeyi deneyin ve ardından öğrenciye ekleyin. Umarım bu şekilde EF tarafından "Eklendi" olarak işaretlenmeyecektir. –

+0

bu gerçekten ideal değil. Ebeveyn-çocuk ilişkisinin öncelikle bir nesne düzeyinde gerçekleşmesini istiyorum, çünkü henüz db'ye kaydedilmeye hazır olmayabilir. Belki de, EF'in yarattığı varlıklar arasındaki tüm ilişkileri kendim kaldırmalı mıyım? – MakkyNZ

0

İdare Framework dayalı bir veritabanı şemasını göstermektedir. tabii okuma ve aynı kullanarak ifadesi içinde öğrenciye ders bağlayan yerleştirirseniz

, Yarar.

0

Ayrıca, benim için çalıştığım ikinci seçeneği denedim. İlk önce nesne düzeyinde gerçekleşen ebeveyn-çocuk ilişkisini beğendim ve db'ye kaydedin. Belki de EF'in yarattığı varlıklar arasındaki tüm ilişkileri kendim kaldırmalıyım.