la funzione di semi di Entity Framework non inserire tutti i dati al database
-
25-10-2019 - |
Domanda
Ho una classe che eredita da DropCreateDatabaseIfModelChanges.
public class SetupData : DropCreateDatabaseIfModelChanges<CyclingClubContext>
{
protected override void Seed(CyclingClubContext context)
{
var _CycleType = new List<CycleType>
{
new CycleType { Type = "Leisure Cycle Type A" },
new CycleType { Type = "Mountain Bike Type A" },
new CycleType { Type = "Racer" },
new CycleType { Type = "Leisure Cycle Type B" },
new CycleType { Type = "Mountain Bike Type B" }
};
new List<CycleModel>
{
new CycleModel{ Model = "Challenge 26in", CycleType = _CycleType.Single(r => r.Type == "Racer") },
new CycleModel{ Model = "Challenge 27in", CycleType = _CycleType.Single(r => r.Type == "Racer") },
new CycleModel{ Model = "Muddy Fox Vortex", CycleType = _CycleType.Single(r => r.Type == "Leisure Cycle Type A") },
new CycleModel{ Model = "Laser 8", CycleType = _CycleType.Single(r => r.Type == "Leisure Cycle Type B") },
new CycleModel{ Model = "Silverfox 26in", CycleType = _CycleType.Single(r => r.Type == "Mountain Bike Type B") }
}.ForEach(IndividualRow => context.CycleModel.Add(IndividualRow));
}
}
Dopo corro questa classe, ho trovato che ...
Due tabelle create.
1) Ciclo di Modello (tutte riga inserita correttamente).
2) Tipo di ciclo (una riga a sinistra per inserire) [Problema].
Mountain Bike tipo A non è inserto a tavola CycleType.
Penso, ho bisogno di modificare il mio codice, ma non so come avrei potuto farlo.
Non voglio inserire un'altra riga come qui di seguito in modo che possa risolvere il mio problema.
new CycleModel{ Model = "Testing...", CycleType = _CycleType.Single(r => r.Type == "Mountain Bike Type A") }
mi permetta di ottenere il suggerimento.
Soluzione
A Seed() method should end with a context.SaveChanges()
.
As it stands now it's strange anything is saved at all.
But it's clear that "Mountain Bike Type A" is not referenced by any CycleModel and that is why it's left out.
You can probably fix it with
_CycleType.ForEach(IndividualRow => context.CycleType.Add(IndividualRow));
Altri suggerimenti
You are only adding CycleModel
s to the context. When you add a CycleModel
EF will add all the related entities that CycleModel
instance keep reference to. Here the list of CycleModel
s added to the context does not have any relation to the CycleType
"Mountain Bike Type A". Hence it is not added.
You can add all the CycleType
s first.
var _CycleType = new List<CycleType>
{
new CycleType { Type = "Leisure Cycle Type A" },
new CycleType { Type = "Mountain Bike Type A" },
new CycleType { Type = "Racer" },
new CycleType { Type = "Leisure Cycle Type B" },
new CycleType { Type = "Mountain Bike Type B" }
}.ForEach(c => context.CycleType.Add(c));
Or you can add that instance separately.
context.CycleType.Add(_CycleType.Single(r => r.Type == "Mountain Bike Type A"));