Mam klasę POCO (OPERATION), która jest wykorzystywana jako jednostka ramowa jednostki. Ta klasa ma właściwość nawigacji (OP) i klucz obcy w ten sam podmiot powiązany ({x2}}).

W metodzie otrzymuję OPERATION i na tym OPERATION OP_ID i OP są zarówno null. Gdy ustawię OP_ID do prawidłowej wartości dla tego klucza obcego, właściwość nawigacji OP pozostaje null. Kiedy jawnie wykryłem zmiany w kontekście, właściwość nawigacji OP jest teraz przypisana z prawidłową wartością.

Przykładowy kod

public bool UpdateOperation(operationID)
{
    IQueryable<OPERATION> operations = from o in base.ctx.OPERATION
                                                        select o;

    OPERATION operation = operations
        .Where(o => o.OPERATION_ID == operationID)
        .Include("OP")
        .FirstOrDefault();

    if (operation != null)
    {
        operation.OP_ID = opId;
    }
    
    // operation.OP is null here

    operation.GetContext().ChangeTracker.DetectChanges();

    // operation.OP is populated here
}

Potwierdziłem, że operation jest w rzeczywistości dynamiczny proxy. Za co warto, gdy wykryję zmiany, operation.OP również staje się również dynamicznym proxy. Jednak nawet następnie przypisując wartość różne do operation.OP_ID nadal wymaga wywołania wywołania DetectChanges() w celu zaktualizowania wartości operation.OP.

Aktualizuj

W odpowiedzi na komentarz @erikphilips, dokumentacja tutaj wydaje się sugerować, że niniejsze nastąpi Konkretnie:

Poniższe przykłady pokazują, jak korzystać z właściwości kluczowych kluczowych i właściwości nawigacyjnych do skojarzenia powiązanych obiektów. Dzięki zagranicznym stowarzyszeniu można użyć dowolnej metody zmiany, tworzenia lub modyfikacji relacji. Z niezależnymi stowarzyszeniami nie można używać właściwości klucza obcego.

Przypisując nową wartość do właściwości klucza obcego, jak w poniższym przykładzie.

course.DepartmentID = newCourse.DepartmentID;

...

Gdy zmienisz relację obiektów dołączonych do kontekstu, używając jednej z opisanych powyżej metod, ramy podmiotu musi zachować klucze obce, odniesienia i kolekcje w synchronizacji. Framework podmiotów automatycznie zarządza tym synchronizacją (znany również jako poprawka relacji) dla jednostek PCO z pełnomocnikami.

Jeśli używasz POCO podmiotów bez serwera proxy, musisz upewnić się, że metoda detektywki jest wywoływana, aby synchronizować powiązane obiekty w kontekście.

Niektóre dodatkowe kontekst mogą być również przydatne. Jest to starsza aplikacja, która używana bezpośrednio z ObjectContext zamiast DbContext, choć nawet za pomocą EF 6. Teraz migrujemy do API {X2}}. Ten konkretny kod, bez żadnych modyfikacji, używany do wykazania zachowania, jakiego oczekuję. W szczególności, gdy przypisano OP_ID, widzę, że w debugeru, że właściwość OP jest automatycznie zalogowany, aby wskazać poprawny {x5}}.

0
GarlicFries 18 styczeń 2020, 00:49

1 odpowiedź

Najlepsza odpowiedź

W końcu I był dokładnie, co opisano dokumentację. byłam

przypisanie nowej wartości do właściwości klucza obcego.

Tak, Entity Framework zarządza tym w naprawie. I tak, dokumentacja stanowi to.

Okazuje się jednak, że jajko jest ostatecznie na mojej twarzy. Sprawdziłem zajęcia generowane z mojego szablonu T4 i widziałem, że wszystkie właściwości nawigacyjne były oznaczone virtual. Nie sprawdzałem wystarczająco dokładnie, aby pamiętać, że właściwości klucza obcego nie były virtual. Wydaje się, że jest to domyślne zachowanie szablonu T4 dostarczonego przez EF używanego podczas pracy lub baza danych. Zajmowałem się tym, zmieniając tę linię w metodzie {x2}} w szablonie T4

Accessibility.ForProperty(edmProperty)

Do

AccessibilityAndVirtual(Accessibility.ForProperty(edmProperty))

W końcu, jak zwykle, zgodnie z dokumentacją (tutaj, wymagania dotyczące śledzenia zmian EF na POCO) często powodują, że kod zależny zachowujący się, jak jest udokumentowany. Szkoda na mnie.

0
GarlicFries 21 styczeń 2020, 20:11