Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: [EF] Edycja entity powiązanego relacją z innym entity

Cześć, naprowadzilibyście mnie? Jestem początkujący i się zgubiłem.

Mam entity user i entity user_data, połączone relacją. Jakimś dziwnym trafem po pobraniu (za pomocą LINQ) wybranego obiektu entity, obiekt ten ma status Modified. Zmieniam status ręcznie na Detached bo potrzebuję, żeby mój obiekt miał status detached, aby móc bezpiecznie zapisać zmiany w bazie danych.


private void Detach(user user)
{
ObjectContext context = ((ObjectQuery)((IEntityWithRelationships)user).RelationshipManager.GetAllRelatedEnds().First().CreateSourceQuery()).context;
context.Detach(user.user_data);
context.Detach(user);
}


Ale dzieje się coś dziwnego w momencie edycji rekordów...

private void UpdateRecord()
{
UserRepositryModel userRepositoryModel = new UserRepositryModel();
user vuser;
vuser = _userGroupList.ToList<user>().ElementAt(0);
Detach(vuser);
//po dokonaniu Detach, vuser w miejscu user_data dostaje null
//dlaczego?? Jak podpiąć z powrotem to co EF automatycznie wynulował?
vuser.forename = _forename;
vuser.surname = _surname;
UserRepositoryModel.Edit(vuser);
UserRepositoryModel.Save();
}


W momencie Save() leci taki wyjątek

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.


Patrzyłem na Google, ale tam wyjaśniali, że ten wyjątek leci głównie wtedy, gdy chcemy wykasować z bazy danych jakiś rekord powiązany relacjami z inną tabelą, bez usunięcia danych w tej innej tabeli. Tu jednak ja chcę zmodyfikować rekord, a nie chcę go wcale usunąć.Borysław Bobulski edytował(a) ten post dnia 30.09.11 o godzinie 16:09
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: [EF] Edycja entity powiązanego relacją z innym entity

Dziś spostrzegłem, że da się to prosto obejść, wyszukując za pomocą LINQ user_data z odpowiednim id i podłączając na sztywno wyszukane tak entity do pola user.user_data


user.user_data = linq_user_data;


Niestety Detached entity (user) zmieni swój stan na Added. Nie chcę Added, ani Modified - chcę Detached.

Czy to w ogóle jest możliwe?Borysław Bobulski edytował(a) ten post dnia 03.10.11 o godzinie 12:59

konto usunięte

Temat: [EF] Edycja entity powiązanego relacją z innym entity

Ogólne spostrzeżenie: walczysz z frameworkiem, zamiast z niego korzystać. Spróbuj się zresetować i zacząć od zera, może EF nie pasuje do twojego przypadku użycia.
Jako hint spróbuj uzasadnić dlaczego:
Zmieniam status ręcznie na Detached bo potrzebuję, żeby mój obiekt miał status detached, aby móc bezpiecznie zapisać zmiany w bazie danych.
możesz uzasadnić?
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: [EF] Edycja entity powiązanego relacją z innym entity

Przyznaję się bez bicia - to troszkę z mojego słabego rozeznania wynikało.

Chciałem zrobić update rekordu w bazie danych używając SaveChanges() więc należało dołączyć entity do kontekstu (attach to context). Niestety, nie mogę tego zrobić zawsze za pomocą context.Attach(entity), gdyż czasami entity jest zupełnie nieznane kontekstowi, jest uznawane przezeń za zupełnie nowe, w związku z czym EF nie zna żadnych zmian, które zostały wprowadzone i które trzeba uaktualnić za pomocą SaveChanges właśnie :) Ponieważ nie mogę porównać danych w entity z faktycznymi danymi w bazie danych odpytuję bazę danych o aktualne dane rekordu, który mnie interesuje, podając EnityKey i następnie podłączam te dane dla tego entity poza kontekstem. Następnie zmuszam EF aby znalazł różnicę (changes). Gdy będą znane różnice, to SaveChanges() dokona zapisu.

Natomiast EF w entity o statusie Modified w moim wypadku również nie widziało żadnych zmian i w związku z czym SaveChanges nie dokonywało żadnego zapisu. Ten kod, o którym mówię, dołączał zmiany tylko dla entity o statusie Detached. Dlatego na wszystkim chciałem robić Detached, aż w końcu pomyślałem i wybrałem najprostszą opcję - dodałem warunek aby opisany wyżej kod wykonywał się również na entity o stanie Modified - i jest okej.

edit:
swoją drogą nie rozumiem dlaczego obiekt o statusie Modified nie ma w sobie zmian:/Borysław Bobulski edytował(a) ten post dnia 05.10.11 o godzinie 15:07



Wyślij zaproszenie do