Załóżmy, że masz te klasy w swoich jednostkach.Czy to naprawdę niemożliwe, aby zaktualizować kolekcję dzieci w EF po wyjęciu z pudełka (inaczej nie-hacky)?
public class Parent
{
public int ParentID { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public int ChildID { get; set; }
public int ParentID { get; set; }
public virtual Parent Parent { get; set; }
}
i masz interfejs użytkownika do aktualizacji Parent
wraz z jego Children
, co oznacza, jeśli użytkownik dodawać nowe Child
potem trzeba włożyć, jeśli użytkownik edytuje istniejący Child
to trzeba zaktualizować, a jeśli użytkownik usuwa Child
, a następnie musisz go usunąć. Teraz oczywiście jeśli użyć następującego kodu
public void Update(Parent obj)
{
_parent.Attach(obj);
_dbContext.Entry(obj).State = EntityState.Modified;
_dbContext.SaveChanges();
}
nie będzie w stanie wykryć zmiany wewnątrz Child
ponieważ EF nie może wykryć zmiany wewnątrz Nieruchomość nawigacji.
Zadaję to pytanie 4 razy i otrzymuję mieszane odpowiedzi. Czy rzeczywiście można to zrobić bez komplikacji? Ten problem może rozwiązać problem, oddzielając interfejs użytkownika między Parent
i Child
, ale nie chcę, ponieważ łączenie zarówno Child
i Parent
w jednym menu jest dość powszechne w tworzeniu aplikacji biznesowych i bardziej przyjazne dla użytkownika.
AKTUALIZACJA: Próbuję rozwiązania poniżej, ale to nie działa.
public ActionResult(ParentViewModel model)
{
var parentFromDB = context.Parent.Get(model.ParentID);
if (parentFromDB != null)
{
parentFromDB.Childs = model.Childs;
}
context.SaveChanges();
}
Zamiast wykrywania zmian wewnątrz dzieci, EF nie będzie w stanie powiedzieć, co zrobić ze starym dziecka. Na przykład, jeśli parentFromDB
ma 3 dzieci przy pierwszym wyciągnięciu go z DB, to usuwam drugie i trzecie dziecko. Otrzymuję The relationship could not be changed because one or more of the foreign-key properties is non-nullable
podczas zapisywania.
Wierzę, że to, co się stało: The relationship could not be changed because one or more of the foreign-key properties is non-nullable
Który zabrał mnie z powrotem do punktu wyjścia, bo w moim scenariuszu, nie mogę po prostu pobrać z DB i zaktualizować wpis i zadzwonić SaveChanges
.
Nie wiem, czy mam źle pytanie. Czy wyłączenie śledzenia zmian jest wymagane? W przeciwnym razie można to łatwo osiągnąć dzięki śledzeniu zmian EF. Dzięki śledzeniu zmian nie musisz jawnie ustawiać stanu obiektów, EF zrobi to za Ciebie, więc wszelkie modyfikacje wprowadzone do kolekcji Childs, w tym modyfikacje elementów kolekcji, będą automatycznie uwzględniane w zestawie zmian po zatwierdzeniu kontekstu (SaveChanges). –
Zgadzam się z komentarzem odyss-jii, ale chcę dodać do niego dodatkowe informacje: oczywiście działa to tylko wtedy, gdy utrzymujesz kontekst otwarty między odszukiwaniem a zmianą właściwości z powrotem. w przeciwnym razie będziesz musiał sam ustawić swój byt podmiotu, a do tego będziesz musiał najpierw uzyskać wszystko w kontekście, więc musisz utworzyć wpis dla każdego obiektu i ustawić jego stan. – DevilSuichiro
możesz być bardziej konkretny? Opublikuj kod, jeśli to możliwe. To właśnie mam na myśli (nie mogę znaleźć wersji EF6). http://www.entityframeworktutorial.net/EntityFramework4.3/update-one-to-many-entity-using-dbcontext.aspx – warheat1990