Używam konfiguracji EF5 opartej na Code-First DBContext.AddOrUpdate działa niezgodnie z oczekiwaniami i produkuje duplikaty.
W DbMigrationsConfiguration.Seed
Próbuję wypełnić DB domyślnymi danymi fikcyjnymi. Aby wykonać to zadanie, używam metody DbSet.AddOrUpdate
.
Najprostszy kod do zilustrowania mój cel:
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++;
}
Próbowałem użyć/pomijania Id
dziedzinie, jak również do korzystania Id
/Slug
nieruchomości jako selektor aktualizacji.
po uruchomieniu Update-Database
, pole Id
jest ignorowane, a wartość jest generowana automatycznie przez SQL Server, a DB jest wypełniane duplikatami; Slug
selektor umożliwia duplikaty, a na kolejnych przebiegach tworzy wyjątki (Sequence contains more than one element
).
Czy metoda ma działać w ten sposób? Czy powinienem wykonywać upsert ręcznie?
Gert, dziękuję za pomoc! Właściwie miasto otrzymało "id = j", który zawiera się w przedziale od 0 do 9. Zostaliście po prostu oszukani przez podobne nazwy zmiennych. Następnie wspomniałem już o wpływie używania nazwy (w moim przypadku Slug, ponieważ jest naprawdę wyjątkowy) - pozwala to na powielenie w DB. Przekazywanie wszystkich obiektów jako tablicy nie przyniosło żadnego postępu. – berezovskyi
Dziękujemy za zaktualizowanie odpowiedzi. Nie mogę już tego zweryfikować. Jeśli ktokolwiek ze społeczności skomentuje pod twoją odpowiedzią, że mu to pomogło, zaznaczę twoją odpowiedź jako zaakceptowaną. Przepraszam, że to trwało tak długo. – berezovskyi
Jakieś pojęcie, w jaki sposób wyglądałoby wyrażenie identyfikatora, gdyby wymagało dwóch pól, aby jednoznacznie zidentyfikować rekord? Myślę, że p => p.ProductName, p.CategoryName (ale oczywiście to nie działa). – Jarvis