2017-04-08 3 views
1

Ich habe das ADO.NET-Entitätsdatenmodell für Entity Framework einer lokalen Datenbank in meinem VS-Projekt verwendet. Es gibt nur eine Tabelle mit zwei zusammengesetzten Primärschlüsseln (UserId, Data) und einem änderbaren Feld (Status).Das Aktualisieren eines Datensatzes löst Änderungen aller Datensätze für denselben Primärschlüssel in Entity Framework aus. 6

Das Problem ist, wenn ich versuche, einen bestimmten Datensatz abzurufen und ändern Sie seine "Status" -Feld, alle "Status" für die gleiche UserId ändern unabhängig von ihrem Wert von Daten. (Allerdings sind die Aufzeichnungen unter verschiedenen UserId unberührt bleiben.) Die Aktualisierung Codes sind wie folgt:

public void updateStatus(string userId, string data, short status) 
    using (var context = new MyDBContext()) { 
     var data = context.UserDataStatus.Single(s => s.UserId == userId && s.Data == data); 
     data.Status = status; 
     context.UserImageStatus.Attach(data); 
     context.Entry(data).Property(p => p.Status).IsModified = true; 
     context.SaveChanges(); 
    } 
} 

ich viele verschiedene Arten versucht, die Aufzeichnung, wie die Verwendung von .Where().FirstDefault() zu aktualisieren, um die Aufzeichnung abzurufen, anstatt Single() oder das Hinzufügen .AsNoTracking() nach meiner context.UserDataStatus. Es hat aber auch nicht funktioniert.

Ich habe festgestellt, dass manchmal Entity Framework nicht korrekt mit duplizierten/keine Primärschlüssel behandelt, zum Beispiel muss ich hinzufügen .AsNoTracking() in der Abfrage als Workaround beim Abrufen von Daten aus der gleichen Datenbank. Ich frage mich, ob es der gleiche Grund ist, der das Aktualisierungsproblem verursacht, und wie man es löst?

====

Aktualisiert:

Nun, schließlich habe ich das Problem gefunden, dass Benutzer-ID als Primärschlüssel nur die automatisch generierten EF-Modelle gab verursacht wird. Obwohl ich in .edmx "Modell aus Datenbank aktualisieren" gewählt habe, wurde der Primärschlüssel überhaupt nicht aktualisiert. Also ging ich zum .edmx-Modell-Browser, manuell aktualisiert die Eigenschaft von "Daten" -Feld, und das Problem wurde gelöst. Und ich muss auch nicht mehr .AsNoTracking() in meiner Abfrage verwenden.

Antwort

1

Nun, schließlich habe ich festgestellt, dass das Problem dadurch verursacht wird, dass die automatisch generierten EF-Modelle nur UserId als Primärschlüssel gaben. Obwohl ich in .edmx "Modell aus Datenbank aktualisieren" gewählt habe, wurde der Primärschlüssel überhaupt nicht aktualisiert. Also ging ich zum .edmx-Modell-Browser, manuell aktualisieren Sie die Eigenschaft von "Data" -Feld (um es als Primärschlüssel zu setzen), und das Problem wurde gelöst. Und ich muss auch nicht mehr .AsNoTracking() in meiner Abfrage verwenden.

Verwandte Themen