Frage

EDIT: Stub Entities Definition

Ich habe zwei Entitätstypen Subscriber und AddOn

Ihre Definition in Datenmodell ist als unten

Abonnenten ( #SubscriberID , Name AddOnID)

AddOn ( #AddOnID , Name)

AddOnID Spalt in der Abonnenten-Tabelle verweisen auf die AddOnID Spalte in AddOn Tabelle.


Ich versuche, den AddOn Bezug einer bestimmten Subscriber Entität zu aktualisieren. Lassen Sie uns sagen, ich habe die Teilnehmer # 1 AddOn Bezug auf AddOn # 5 ändern möchten. Hier ist der Code:

    Subscriber subscriber = new Subscriber { SubscriberID = 1};
    AddOn newAddOn = new AddOn { AddOnID = 5};

    using (var context = new TestEntities())
    {
        context.AttachTo("AddOn", newAddOn);
        context.AttachTo("Subscriber", subscriber);

        subscriber.Name = "dummy";
        subscriber.AddOn = newAddOn;

        context.SaveChanges();
    }

Dies löst eine Ausnahme in der Zeile " context.SaveChanges (); "

  

Eine Beziehung von einem AssociationSet 'FK-Subscriber-AddOn' hinzugefügt oder gelöscht wird. Mit Mächtigkeit Einschränkungen muss eine entsprechende ‚Teilnehmer‘ auch hinzugefügt oder gelöscht werden.

Als ich die " subscriber.AddOn = newAddOn; " Kommentar aus Linie, der Aktualisierungsvorgang funktioniert gut.

Also, warum kann ich nicht nur die Referenz Eigenschaft aktualisieren, wie als ich die Nicht-Referenz eine aktualisieren?


Hinweis: Ich weiß nicht, ob es der richtige Weg ist, aber das Hinzufügen eines " context.Refresh (RefreshMode.StoreWins, Teilnehmer); " oder „ context.Refresh (Refreshmode. ClietWins, Teilnehmer);. “nach anhängen Aussagen machen die Dinge funktionieren

Warum ist das Verhalten?

War es hilfreich?

Lösung

In EF 3.5 SP1 Sie können nicht eine Referenz (das heißt subscriber.Addon) ändern, ohne den ursprünglichen Wert zu kennen. Hinweis Diese Einschränkung geht weg in EF 4, wenn Sie verwenden FK Verbände .

Jetzt die meiste Zeit versteckt sich das EF diese zusätzliche Komplexität von Ihnen, aber nicht, wenn Sie verwenden, wie dies anhängen.

Hier ist der Code, den Sie brauchen:

AddOn newAddOn = new AddOn { AddOnID = 5};
AddOn oldAddOn = new AddOn { AddOnID = 4}; // you need to remember the old id.
Subscriber subscriber = new Subscriber { SubscriberID = 1, AddOn = oldAddOn};

using (var context = new TestEntities())
{
    context.AttachTo("AddOn", newAddOn);
    context.AttachTo("Subscriber", subscriber); // will attach the oldAddOn too

    subscriber.Name = "dummy";
    subscriber.AddOn = newAddOn;

    context.SaveChanges();
}

Wie Sie sehen können wir einfach die EF über die ursprüngliche Beziehung zu erzählen, und es dann nach wie vor zu ändern.

Das sollte Ihr Problem beheben.

Wie Sie Refresh entdeckt Aufruf auch funktioniert ... weil sie den ursprünglichen Wert für die Referenz aus der Datenbank für Sie packt. Der Nachteil der Verwendung von Refresh ist es eine Abfrage in die Datenbank zurück gibt.

So der ursprüngliche Wert Befestigung wie einfach oben spart die zusätzliche Abfrage.

Hope, das hilft

-Alex

Programm-Manager Entity Framework-Team.

Siehe Tipp 26 von meinen EF Tipps Serie für weitere Informationen.

Andere Tipps

Ich glaube, Sie fragen, wie ein Kind Einheit zu einer anderen Einheit hinzuzufügen. Also, in Ihrem Fall haben Sie die übergeordnete Entität: Teilnehmer und ein Kind Einheit: AddOn. Wenn dies der Fall ist, und Ihr Datenmodell hat die richtige Beziehung Setup dann werden Sie wahrscheinlich wollen Code wie:

Subscriber subscriber = new Subscriber { SubscriberID = 1};
AddOn newAddOn = new AddOn { AddOnID = 5};

using (var context = new TestEntities())
{

    context.AttachTo("Subscriber", subscriber);
    subscriber.Addon.Add(newAddOn);

    subscriber.Name = "dummy";

    context.SaveChanges();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top