2010-05-28 24 views
6

Ich bin mit EF 4, Abbildung aller CUD-Operationen für meine Entitäten sprocs verwenden.Entity Framework 4 Entity mit EntityState von Unverändert Brennen Update

Ich habe zwei Tabellen, ADDRESS und PERSON. Ein PERSON kann mehrere ADDRESS zugeordnet haben. Hier

ist der Code bei mir läuft:

Person person = (from p in context.People 
          where p.PersonUID == 1 
          select p).FirstOrDefault(); 

Address address = (from a in context.Addresses 
           where a.AddressUID == 51 
           select a).FirstOrDefault(); 

address.AddressLn2 = "Test"; 

context.SaveChanges(); 

Die Adresse aktualisiert wird, die mit der Person, die ich bin retrieveing ​​- obwohl sie nicht explizit in irgendeiner Weise im Code verknüpft. Wenn context.SaveChanges() ausgeführt wird, wird nicht nur das Update-Sproc für meine Address-Entity ausgelöst (wie erwartet), sondern auch das Update-Sproc für die Entität Person - obwohl Sie sehen können, dass an der Entity keine Änderung vorgenommen wurde Personenentität

Wenn ich den EntityState beider Objekte vor dem Kontext.SaveChanges() - Aufruf überprüfe, sehe ich, dass meine Address-Entität einen EntityState von "Modified" hat und meine Person enity einen EntityState von "Unchanged" hat.

Warum wird das Update-Sproc für die Person-Entität aufgerufen? Gibt es eine Einstellung, die ich einstellen kann, um dies zu verhindern?

Ich habe ein zweites Projekt erstellt, um sicherzustellen, dass das Problem wegen etwas in meiner aktuellen Projektumgebung nicht passiert.

Zuerst habe ich eine neue Datenbank, die eine Order und Orderdetail-Tabelle enthält. Sie haben einen Fremdschlüssel zwischen ihnen, so dass Order mehr als ein OrderDetail zugeordnet sein kann. Ich habe auch DB-Trigger "nach Update" für die Order- und OrderDetail-Tabellen erstellt, die ein DateTime-Feld aktualisieren, wenn ein Datensatz aktualisiert wird.

Zweitens habe ich eine einfache WPF-Anwendung und ein ADO.NET Entity Modell erstellt, das aus meiner Datenbank generiert wurde.

Drittens habe ich Code in meiner Klasse Konstruktor wie folgt:

public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MyEntities context = new MyEntities(); 

     Order order = (from o in context.Orders 
       select o).FirstOrDefault(); 

     OrderDetail orderDetail = (from d in order.OrderDetails 
        select d).FirstOrDefault(); 

     orderDetail.Qty = 7; 

     context.SaveChanges(); 
    } 
    } 

ich das Programm lief jede Funktionszuordnung für meinen Auftrag und Orderdetail Objekte ohne zu tun. Das Ergebnis war genau das, was ich erwarten würde, der OrderDetail-Datensatz wurde auf eine Anzahl von 7 aktualisiert, und das UpdateDateTime-Feld wird mit dem Datum und der Uhrzeit des Updates gefüllt. Keine Änderungen an meinem Auftragsdatensatz, was bedeutet, dass keine Aktualisierung stattgefunden hat.

ich dann gespeicherte Prozeduren erstellen, die Aktualisierung der Ordnung und Orderdetail-Tabellen in der DB zu behandeln. Sie tun nichts Spezielles, akzeptieren einfach Parameter für jede Spalte in der Tabelle und setzen jedes Feld dann auf den zugehörigen Parameter. Ich habe dann diese gespeicherten Prozeduren mithilfe des Fensters Mapping-Details (Map Entity to Functions) zu meinen Model-Objekten gemappt.

Nach dem Mapping habe ich das Programm ausgeführt. Als Ergebnis beobachtete ich das erwartete Verhalten von Updates auf die OrderDetail-Tabelle, aber zusätzlich der Trigger-Befehl "Tabelle nach Trigger" ausgelöst hatte und das UdateDateTime-Feld auf das Datum und die Uhrzeit der Aktualisierung festgelegt wurde - was ich nicht erwarten würde.

Kennt jemand eine Möglichkeit, gespeicherte Prozeduren für alle Operationen Einfügen, Aktualisieren und Löschen zu verwenden und die Aktualisierungen nicht auf verwandte Entitäten zu kaskadieren?

+0

Nur um sicher zu gehen, ist kein anderer Code mit Ihrem Fehler verbunden? – Nix

+0

Ich sehe keinen Fehler. Ich sehe nur nicht das Verhalten, das ich erwarte, und ich frage mich, warum und was ich tun muss, um das erwartete Verhalten zu sehen, das wäre, dass nur die Address-Entität in der DB aktualisiert wird. Der einzige andere Code wäre die Instantiierung meines Kontextobjekts, das nur eine neue Instanz des EF-generierten Entitätskontexts erstellt. – Filosopher

+0

AKTUALISIERUNG: Wie ich in meinem ursprünglichen Beitrag gesagt habe, verwende ich gespeicherte Prozeduren, um mit Erstellen, Aktualisieren und Löschen für alle meine Tabellen umzugehen. Ich habe diese Zuordnungen einfach aus meinem Modell entfernt und den Code erneut mit einem DB-Auslöser in der Tabelle Person ausgeführt, und es ist KEIN UPDATE eingetreten. Es sieht so aus, als ob die Sproc-Mappings für Create, Update und Delete in diesem Fall das Update verursachen. Leider müssen wir für diese Operationen sprocs verwenden, so dass eine Lösung immer noch erforderlich ist. Ich dachte nur, ich würde das Posting mit mehr Informationen aktualisieren. – Filosopher

Antwort

4

Ich hatte das gleiche Problem, und es wird von dem Hotfix wurde auf that MS KBD page erwähnt gelöst.

Das Update wurde nur in .NET 4.5 veröffentlicht. Ich erwarte jedoch, dass EF 6 (das auf .NET 4/.NET 4.5 funktioniert) dieses Update auch ausliefert, da es die Version von System.Data.Entity.dll, die mit .NET 4 geliefert wird, mit seinem eigenen ersetzt.

Verwandte Themen