La función de semilla del marco de la entidad no insertó todos los datos en la base de datos
-
25-10-2019 - |
Pregunta
Tengo una clase que hereda de 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));
}
}
Después de ejecutar esta clase, descubrí que ...
Dos tablas creadas.
1) Modelo de ciclo (toda la fila insertada correctamente).
2) Tipo de ciclo (una fila izquierda para insertar) [Problema].
La bicicleta de montaña Tipo A no es insertar en la tabla Cycletype.
Creo que necesito modificar mi código, pero no sé cómo podría hacerlo.
No quiero insertar otra fila como a continuación para que pueda resolver mi problema.
new CycleModel{ Model = "Testing...", CycleType = _CycleType.Single(r => r.Type == "Mountain Bike Type A") }
Por favor, déjame recibir sugerencias.
Solución
Un método de semilla () debe terminar con un context.SaveChanges()
.
Tal como está ahora, es extraño, cualquier cosa se guarda en absoluto.
Pero está claro que "Mountain Bike Type A" no es referenciado por ningún ciclodelo y es por eso que queda fuera.
Probablemente puedas arreglarlo con
_CycleType.ForEach(IndividualRow => context.CycleType.Add(IndividualRow));
Otros consejos
Solo estas agregando CycleModel
s al contexto. Cuando agregas un CycleModel
EF agregará todas las entidades relacionadas que CycleModel
instancia mantenga la referencia a. Aquí la lista de CycleModel
S agregado al contexto no tiene ninguna relación con el CycleType
"Montaña Bike Tipo A". Por lo tanto, no se agrega.
Puedes agregar todo el CycleType
s primero.
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));
O puede agregar esa instancia por separado.
context.CycleType.Add(_CycleType.Single(r => r.Type == "Mountain Bike Type A"));