Pytanie Entity Framework Split Table Delete


Używam EF 4 STE do modelowania obiektu Attachment. The Załącznik zawiera nazwę, opis, datę i najważniejsze dane (byte[]). Aby zoptymalizować ładowanie, nie chcę pobierać właściwości Data, dopóki nie jest to absolutnie konieczne, tj. Gdy użytkownik kliknie Download od klienta.

Starając się postępować zgodnie z tym podejściem, użyłem opisanej techniki dzielenia stołu tutaj. Rozdzielam moje Załącznik zagłębić się w Załącznik (Nazwa, opis, data) i AttachmentData (Dane). Jest to relacja 1 do 1 w moim modelu EF. Wszystko działa świetnie, dopóki nie spróbuję usunąć Załącznik bez AttachmentData (to znaczy. attachment.AttachmentData == null). Otrzymuję następujący wyjątek:

Napotkano nieprawidłowe dane. Brakuje wymaganego związku. Sprawdź StateEntries, aby określić źródło naruszenia ograniczenia.

widziałem podobny post, ale nie mogę sprawić, żeby działało to z STE i ApplyChanges metoda rozszerzenia.

Teraz mój kod dostępu do danych jest prosty: wzywam kontekst ApplyChanges() śledzony przez SaveChanges().

Próbowałem prostej funkcji usuwania SQL i zmapowałem ją do obu podmiotów, która faktycznie działała; jednak złamał wstawkę. Nie mogę zmapować funkcji wstawiania dla wszystkich właściwości do obu elementów.

Jakieś pomysły dotyczące innych opcji, które mogę wypróbować? Czy związek między załącznikiem a załącznikami może być opcjonalny? Kiedy robię to od 1 do 0+, pojawia się błąd odwzorowania tego Their primary keys may collide.

Otwórz na wszelkie sugestie.

Dzięki!


12
2017-11-17 16:46


pochodzenie




Odpowiedzi:


Rozwiązanie jest podobne do połączonego pytania, ale musisz użyć specyficznej cechy STE - ApplyChanges:

context.Attachments.ApplyChanges(att);
if (context.ObjectStateManager.GetObjectStateEntry(att).State == EntityState.Deleted)
{
    var data = new AttachmentData() {Id = att.Id};
    context.AttachmentDataSet.Attach(data);
    context.AttachmentDataSet.DeleteObject(data);
}
context.SaveChanges();

6
2017-11-18 13:53



Dzięki za odpowiedź! Działa świetnie! - John Russell
To mnie głęboko przejmuje: dlaczego EF nie może tego zrozumieć, skoro encje są przechowywane w tej samej tabeli, usunięcie jednego z nich spowoduje również usunięcie drugiego? Dlaczego musisz go załadować? - Fyodor Soikin
@FyodorSoikin: Chyba nikt jeszcze nie zaimplementował tej funkcji. - Ladislav Mrnka
Co ciekawe, wygląda na to, że Cascade nie wystarczy ... - Benjol