EntityFramework, Einfügen, falls nicht vorhanden, ansonsten aktualisieren
Bin ich mit einer Entity-Set-Ländern, was auf eine Datenbank-Tabelle '<'char(2) char(3),nvarchar(50> in meiner Datenbank.
Ich habe einen parser zurückgibt, Land [] - array der analysierten Länder, und Probleme mit immer es aktualisiert wird, in der richtigen Weise. Was ich will, ist: Nehmen Sie die Reihe von Ländern, für die Länder, die nicht bereits in die Datenbank eingefügt und vorhandene aktualisieren, wenn Sie alle Felder anders ist. Wie kann das getan werden?
void Method(object sender, DocumentLoadedEvent e)
{
var data = e.ParsedData as Country[];
using(var db = new DataContractEntities)
{
//Code missing
}
}
Ich dachte so etwas wie
for(var c in data.Except(db.Countries)) but it wount work as it compares on wronge fields.
Hoffe jemand hatte diese Probleme vor, und eine Lösung für mich. Wenn ich nicht das Country-Objekt-und insert - /update-ein array von Ihnen einfach, ich sehe nicht viel benefict von den Rahmen, wie von Künstlern, die ich denke, die schneller zum schreiben eines benutzerdefinierten sql-Skript, fügt Sie anstelle von ect überprüfen, ob ein Land bereits in der Datenbank vor dem einfügen?
Lösung
Siehe Antwort der post statt.
Fügte ich equals überschreiben, um mein Land Klasse:
public partial class Country
{
public override bool Equals(object obj)
{
if (obj is Country)
{
var country = obj as Country;
return this.CountryTreeLetter.Equals(country.CountryTreeLetter);
}
return false;
}
public override int GetHashCode()
{
int hash = 13;
hash = hash * 7 + (int)CountryTreeLetter[0];
hash = hash * 7 + (int)CountryTreeLetter[1];
hash = hash * 7 + (int)CountryTreeLetter[2];
return hash;
}
}
und habe Sie dann:
var data = e.ParsedData as Country[];
using (var db = new entities())
{
foreach (var item in data.Except(db.Countries))
{
db.AddToCountries(item);
}
db.SaveChanges();
}
InformationsquelleAutor der Frage Poul K. Sørensen | 2011-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde es tun, einfach:
Ich weiß nicht, wie oft Sie in Ihrer Anwendung ausgeführt werden muss in diesem oder in wie vielen Ländern eurer Welt hat. Aber ich habe das Gefühl, dass dies nichts ist, wo Sie denken müssen anspruchsvolle performance-Optimierungen.
Bearbeiten
Alternativer Ansatz, das Problem würde nur eine einzige Abfrage:
InformationsquelleAutor der Antwort Slauma
Ist die moderne form, mit späteren EF-Versionen sein:
AlreadyExists
kommen kann, von der überprüfung der-Taste oder durch das Abfragen der Datenbank, um zu sehen, ob das Element bereits existiert.InformationsquelleAutor der Antwort Gábor
Können Sie implementieren Ihre eigenen
IEqualityComparer<Country>
- und übergeben, dieExcept()
Methode. Vorausgesetzt, Ihr Land Objekt hatId
undName
Eigenschaften, ein Beispiel dafür, dass die Umsetzung könnte wie folgt Aussehen:und verwenden Sie es als
Obwohl, in Ihrem Fall sieht es aus wie Sie brauchen nur zu entpacken, neue Objekte, die Sie verwenden können
var newCountries = data.Where(c => c.Id == Guid.Empty);
wenn Ihre Id ist die Guid.Ist der beste Weg zur Prüfung der
Country.EntityState
Eigentum in Gebrauch nehmen und Handlungen von dort aus in Bezug auf Wert (Freistehend), Geändert, Hinzugefügt, etc.)Benötigen Sie mehr Informationen über das, was Ihr
data
Sammlung enthält also sind die Land-Objekte aus einer Datenbank abgerufen werden, durch das entityframework, in welchem Fall deren Kontext verfolgt werden kann, oder Sie erzeugen Sie mit irgendeiner anderen Art und Weise.InformationsquelleAutor der Antwort Tomislav Markovski
Ich bin nicht sicher, dass dies die beste Lösung sein, aber ich denke, Sie haben, um alle Länder aus der DB dann überprüfen Sie es mit Ihrer analysierten Daten
InformationsquelleAutor der Antwort Amir Ismail