Chcę używać Entity Framework POCO w trybie odłączonym (z kontekstu). W moim scenariuszu tworzę nowy obiekt nadrzędny i chcę dołączyć do niego istniejący obiekt potomny, a następnie zapisać go w bazie danych.
Poniższy kod w sposób niepożądany wprowadza nowy rekord kursu podczas zapisywania nowego rekordu ucznia, kiedy chcę, aby istniejący rekord kursu był powiązany z nowym rekordem ucznia.Entity Framework: dodanie istniejącego potomka POCO do nowego Parent POCO, tworzy nowe dziecko w DB
Jak mogę to zrobić w Entity Framework, gdzie ...
- obiekty mogą być odłączone od kontekstu. (tj. Zapytany w jednym kontekście, a następnie zapisany w innym kontekście)
- Nie trzeba ponownie przesyłać zapytania do rekordu podrzędnego z bazy danych tylko po to, aby dołączyć go do elementu nadrzędnego podczas zapisywania do bazy danych. Naprawdę chcę uniknąć dodatkowych wypraw do bazy, gdy już mam to jako obiekt w pamięci.
Ta strona przedstawia schemat bazy danych, że poniższy kod jest oparty na 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;
}
}
Druga opcja prawie działa, ale otrzymuję komunikat "Obiekt nie może zostać przyłączony, ponieważ jest już w kontekście obiektu." błąd na "ctx.Students.AddObject (stud);" linia. Zakładam, że nie mogę tego zrobić, póki jeszcze robię "stud.Courses.Add (oczywiście);" przed tym . Chciałbym nadal korzystać z kolekcji Courses w obiekcie typu stadnina. – MakkyNZ
Cóż, nie mam rozwiązania przydatnego do przetestowania go, ale spróbuj najpierw go załączyć, a następnie dodać do studenta. Mam nadzieję, że w ten sposób nie zostanie oznaczony jako "dodany" przez EF. –
to naprawdę nie jest idealne. Chciałbym, aby relacja parent-> child odbywała się najpierw na poziomie obiektu, ponieważ może nie być jeszcze gotowa do zapisania w db. Może powinienem po prostu usunąć wszystkie relacje między podmiotami, które EF generuje i samodzielnie to kontrolować? – MakkyNZ