Ich verwende Code-First DBContext-basierte EF5-Setup.AddOrUpdate funktioniert nicht wie erwartet und erzeugt Duplikate
In DbMigrationsConfiguration.Seed
Ich versuche, DB mit Standard-Dummy-Daten zu füllen. Um diese Aufgabe zu erfüllen, verwende ich DbSet.AddOrUpdate
Methode.
Die einfachste Code mein Ziel zu veranschaulichen:
j = 0;
var cities = new[]
{
"Berlin",
"Vienna",
"London",
"Bristol",
"Rome",
"Stockholm",
"Oslo",
"Helsinki",
"Amsterdam",
"Dublin"
};
var cityObjects = new City[cities.Length];
foreach (string c in cities)
{
int id = r.NextDouble() > 0.5 ? 0 : 1;
var city = new City
{
Id = j,
Name = c,
Slug = c.ToLowerInvariant(),
Region = regions[id],
RegionId = regions[id].Id,
Reviewed = true
};
context.CitySet.AddOrUpdate(cc => cc.Id, city);
cityObjects[j] = city;
j++;
}
Ich habe versucht Id
Feld als auch zu verwenden/auslassen als Id
/Slug
Eigenschaft als Update-Selektor zu verwenden.
Wenn Update-Database
ausgeführt wird, wird Id
Feld ignoriert und der Wert wird automatisch von SQL Server generiert und DB ist mit Duplikaten gefüllt; Slug
Selektor erlaubt Duplikate und bei nachfolgenden Läufen erzeugt Ausnahmen (Sequence contains more than one element
).
Ist AddOrUpdate
Methode so zu arbeiten? Sollte ich Upsert von Hand durchführen?
Gert, danke für den Versuch zu helfen! Tatsächlich wurde City die ID = j gegeben, die von 0 bis 9 reicht. Sie wurden gerade von ähnlichen Variablennamen ausgetrickst. Als nächstes habe ich bereits den Effekt der Verwendung von Name (in meinem Fall Slug, wie es wirklich einzigartig ist) erwähnt - es ist das Duplizieren in die DB. Das Übergeben aller Objekte als ein Array führte zu keinem Fortschritt. – berezovskyi
Vielen Dank für die Aktualisierung Ihrer Antwort. Ich kann es nicht mehr verifizieren. Wenn jemand aus der Community unter Ihrer Antwort kommentiert, dass es ihm/ihr geholfen hat, werde ich Ihre Antwort als akzeptiert markieren. Entschuldigung, dass es so lange gedauert hat. – berezovskyi
Gibt es eine Idee, wie der Bezeichnerausdruck aussehen würde, wenn zwei Felder benötigt würden, um den Datensatz eindeutig zu identifizieren? Ich denke p => p.ProductName, p.CategoryName (aber das funktioniert natürlich nicht). – Jarvis