6 Stimmen

Warum wird meine EF4.1-Beziehung bei der Zuweisung eines Nullwerts nicht auf Null gesetzt?

In meinem System habe ich Aufgaben, die optional Kontakten zugewiesen werden können. In meiner Geschäftslogik habe ich also den folgenden Code:

 if (_contactChanged) { task.Contact = contact; }

Wenn kein Kontakt angegeben wurde, wird die contact Variable ist null. Dies ist angeblich um die Kontaktbeziehung zu löschen, wenn ich Änderungen übermittle, aber ich habe bemerkt, dass dies in 99 % der Fälle, in denen ich es tue, nicht geschieht (ich habe gesehen, dass es einmal passiert, aber nicht durchgängig, nachdem ich diesen Code immer wieder durchgegangen bin).

Bei der Fehlersuche habe ich festgestellt, dass _contactChanged es true und der interne Code wird nicht getroffen. Nachdem ich jedoch über task.Contact = contact; Ich stelle fest, dass während contact null ist, task.Contact ist vom Typ

{System.Data.Entity.DynamicProxies
.Contact_4DF70AA1AA8A6A94E9377F65D7B1DD3A837851FD3442862716FA7E966FFCBAB9}

und ist noch mit den vorherigen Daten verknüpft.

Warum wird der Proxy nicht auf Null gesetzt, und wie kann ich das richtig hinbekommen?

9voto

anon Punkte 4502

Wow! Tolle Frage. Ich konnte dies bestätigen/reproduzieren, auch wenn der Referent kein dynamischer Stellvertreter ist . t.Contact = null; funktioniert nicht!

Die beste Antwort, die ich bisher geben kann, ist die:

    context.Entry(task).Reference(t => t.Contact).CurrentValue = null;

Ich hoffe wirklich, dass es einen besseren Weg als diesen gibt, denn das ist eine ziemlich unbequeme Syntax.

UPDATE:

Das funktioniert:

    var task = context.Tasks
        .Where(...your condition here...)
        .Include(t => t.Contact)
        .First();

    task.Contact = null;

OR,

Wenn Sie eine Fremdschlüssel-ID in Ihrem Modell definiert haben (z. B. eine löschbare ContactId), wird dies viel einfacher.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X