Estoy trabajando para sembrar una base de datos que estoy creando para un United Way en el que me ofrezco voluntariamente. (Visite TapRoot + si está interesado en ser voluntario y aplicar algo de aprendizaje)
De todos modos, solo estoy sembrando uno a muchos campos en este momento, pero he conseguido que funcione una tabla a la vez.
public class Seed
{
private CharEmContext _context;
public Seed(CharEmContext context)
{
_context = context;
}
public async Task SeedCounty()
{
if (!_context.Counties.Any())
{
_context.AddRange(_counties);
await _context.SaveChangesAsync();
}
}...`
y
static List<County> _counties = new List<County>
{
new County { Name = "Emmet"},
new County { Name = "Charlevoix"},
new County { Name = "Antrim"},
new County { Name = "Cheboygan"},
new County { Name = "Otsego"},
new County { Name = "None"}
};
Pero tengo problemas cuando intento hacer referencia a los ID asignados una vez que se crean.
Tampoco esto:
static List<City> _cities = new List<City>
{
new City { Name = "Alanson", CountyId = _context.Counties.Where(x=>x.Name =="Emmet").Select(x => x.Id).FirstOrDefault()}, ... }
Ni esto
static List<City> _cities = new List<City>
{
new City { Name = "Alanson", CountyId = _counties.Where(x=>x.Name =="Emmet").Select(x => x.Id).FirstOrDefault()},
trabajos.
Para referencia estoy creando un servicio en mi startup.cs.ConfigureServices
services.AddTransient ();
y llamando a cada método de adición en .Configure(Seed Seeder)
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, Seed seeder)
{
seeder.SeedCounty().Wait();
seeder.SeedCity().Wait();
seeder.SeedLocation().Wait();
Definitivamente, es necesario saber cómo hacer referencia a esos identificadores que el DB crea en las tablas dependientes.
También es curioso si necesito sembrar las tablas de enlace en las relaciones de muchos a muchos ...
Así que la clave fue crear diccionarios explícitos:
Dictionary<string, int> County;
Dictionary<string, int> City;
Dictionary<string, int> Address;
Dictionary<string, int> ServiceType;
Dictionary<string, int> Organization;
Dictionary<string, int> Contact;`
y poblarlos dentro de las acciones semilla:
public async Task SeedCounty()
{
if (!_context.Counties.Any())
{
_context.AddRange(_counties);
await _context.SaveChangesAsync();
}
County = _context.Counties.ToDictionary(p => p.Name, p => p.Id);
}
Luego, para crear listas posteriores que hagan referencia a los ID que ahora están sembrados, se realiza una llamada por separado para crear cada lista dependiente que se sembrará:
public async Task SeedCity()
{
CreateCities(); // Create Dependent List
if (!_context.Cities.Any())
{
_context.AddRange(_cities); //Seed List
await _context.SaveChangesAsync();
}
City = _context.Cities.ToDictionary(p => p.Name, p => p.Id); //Create Dictionary with New Ids
}