Entity Framework Seed Function hat nicht alle Daten in die Datenbank eingefügt
-
25-10-2019 - |
Frage
Ich habe eine Klasse, die von DropCreatedatabaseIfModelChanges erben.
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));
}
}
Nachdem ich diese Klasse geführt hatte, fand ich das ...
Zwei erstellte Tabellen.
1) Zyklusmodell (alle Zeilen korrekt eingefügt).
2) Zyklusart (eine Zeile zum Einfügen links) [Problem].
Mountain Bike Typ A wird nicht zum Tisch -Cycletyp eingesetzt.
Ich denke, ich muss meinen Code ändern, aber ich weiß nicht, wie ich es tun könnte.
Ich möchte keine andere Zeile wie unten einfügen, damit sie mein Problem lösen kann.
new CycleModel{ Model = "Testing...", CycleType = _CycleType.Single(r => r.Type == "Mountain Bike Type A") }
Bitte lassen Sie mich einen Vorschlag bekommen.
Lösung
Eine Seed () -Methode sollte mit a enden context.SaveChanges()
.
Wie es jetzt aussieht, ist es seltsam, dass überhaupt etwas gerettet wird.
Es ist jedoch klar, dass "Mountain Bike Typ A" von keinem Cyclemodel verwiesen wird, und deshalb wird es ausgelassen.
Sie können es wahrscheinlich mit reparieren
_CycleType.ForEach(IndividualRow => context.CycleType.Add(IndividualRow));
Andere Tipps
Sie fügen nur hinzu CycleModel
s zum Kontext. Wenn Sie a hinzufügen CycleModel
EF fügt alle verwandten Einheiten hinzu, die CycleModel
Instanz beziehen sich auf. Hier die Liste von CycleModel
s hinzugefügt zum Kontext hat keinen Zusammenhang mit der CycleType
"Mountain Bike Typ A". Daher wird es nicht hinzugefügt.
Sie können alle hinzufügen CycleType
s zuerst.
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));
Oder Sie können diese Instanz separat hinzufügen.
context.CycleType.Add(_CycleType.Single(r => r.Type == "Mountain Bike Type A"));