Sto utilizzando il primo sistema EF5 basato su DBContext.AddOrUpdate funziona come previsto e produce duplicati
In DbMigrationsConfiguration.Seed
Sto cercando di riempire DB con dati fittizi predefiniti. Per eseguire questa operazione, utilizzo il metodo DbSet.AddOrUpdate
.
Il codice più semplice per illustrare il mio obiettivo:
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++;
}
Ho provato ad utilizzare/omettere Id
campo così come di utilizzare Id
/Slug
proprietà come selettore di aggiornamento.
quando viene eseguito Update-Database
, il campo Id
viene ignorato e il valore viene generato automaticamente da SQL Server e il DB viene riempito con i duplicati; Il selettore Slug
consente duplicati e nelle esecuzioni successive produce eccezioni (Sequence contains more than one element
).
È il metodo AddOrUpdate
destinato a funzionare in questo modo? Devo eseguire upsert a mano?
Gert, grazie per aver cercato di aiutare! In realtà, a City è stato assegnato 'id = j', che va da 0 a 9. Sei stato semplicemente ingannato da nomi di variabili simili. Successivamente, ho già menzionato l'effetto dell'uso di Name (nel mio caso, Slug, dato che è davvero unico) - sta lasciando il duplicato nel DB. Passare tutti gli oggetti come una matrice non ha prodotto alcun progresso. – berezovskyi
Grazie per aver aggiornato la tua risposta. Non posso più verificarlo. Se qualcuno della comunità commenterà sotto la tua risposta che l'ha aiutato, segnerò la tua risposta come accettata. Mi dispiace che ci sia voluto così tanto tempo. – berezovskyi
Qualche idea su come sarebbe l'espressione dell'identificatore se richiedesse due campi per identificare univocamente il record? Sto pensando p => p.ProductName, p.CategoryName (ma ovviamente non funziona). – Jarvis