Obecnie pracuję nad projektem wykorzystującym najnowszą wersję Entity Framework i natknąłem się na problem, którego nie mogę rozwiązać.Struktura obiektu, problemy z aktualizacją powiązanych obiektów
Jeśli chodzi o aktualizację istniejących obiektów, mogę dość łatwo zaktualizować właściwości obiektu, dopóki nie dojdzie do właściwości, która jest odniesieniem do innej klasy.
W poniższym przykładzie mam klasy o nazwie Foo, który przechowuje różne właściwości, z 2 tych będących przypadkach innych klas
public class Foo
{
public int Id {get; set;}
public string Name {get; set;}
public SubFoo SubFoo {get; set}
public AnotherSubFoo AnotherSubFoo {get; set}
}
Kiedy używać poniższego Edycja metody, mijam w obiekcie I Chciałbym zaktualizować i mogę sprawić, że Nazwa będzie poprawnie aktualizowana, ale nie udało mi się znaleźć sposobu na zmianę właściwości SubFoo. Na przykład, jeśli klasa SubFoo ma właściwość Name, która została zmieniona i różni się między moim DB a newFoo, nie jest aktualizowana.
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
var entry = context.Entry<Foo>(dbFoo);
entry.OriginalValues.SetValues(dbFoo);
entry.CurrentValues.SetValues(newFoo);
context.SaveChanges();
return newFoo;
}
Każda pomoc lub wskazówki byłyby mile widziane.
UPDATE: podstawie komentarzem Slauma zmodyfikowałem moje metody
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
context.Entry(dbFoo).CurrentValues.SetValues(newFoo);
context.Entry(dbFoo.SubFoo).CurrentValues.SetValues(newFoo.SubFoo);
context.SaveChanges();
return newFoo;
}
Po uruchomieniu tego teraz, pojawia się błąd
typu jednostka Collection`1 nie jest częścią modelu dla bieżącego kontekstu .
Aby spróbować obejść ten problem, dodałem kod, aby spróbować dołączyć podklasy newFoo do kontekstu, ale przez błąd mówiąc, że ObjectManager już podmiot taki sam
Obiekt z tym samym kluczem już istnieje w ObjectStateManager. ObjectStateManager nie może śledzić wiele obiektów o tych samych kluczowych
Dzięki za komentarz, mam posted an update na moje pytanie – Thewads
@Thewads: Mogę sobie tylko wyobrazić, że masz to „* Kolekcja nie jest ... część modelu ... * "błąd, gdy' Foo.SubFoo' jest typem * kolekcji *. Ale jest to tylko odwołanie 'public SubFoo SubFoo {get; set} 'w twoim przykładowym modelu, a nie kolekcji. Czy to naprawdę nie jest kolekcja? Moja odpowiedź była oparta na bieżącym modelu, w którym 'SubFoo' nie jest zbiorem. – Slauma
Niestety, nie zdawałem sobie sprawy, że model mający kolekcje ma znaczenie ... mój błąd. W modelu, z którym mam do czynienia: public ICollection SubFoo {get; set;} –
Thewads