tl;dr: un coup d'oeil par le biais de mon dwCheckApi projet pour voir comment j'ai mis en œuvre.
Comme d'autres l'ont dit, vous pouvez lire vos données semences de JSON ou similaires (de cette façon, il peut être source contrôlée, si vous voulez).
Le chemin que j'ai mis en place dans le cadre de mes projets est d'avoir une méthode qui est appelée dans l' Configure
méthode dans le Démarrage de classe (uniquement en développement):
if (env.IsDevelopment())
{
app.EnsureDatabaseIsSeeded(false);
}
qui appelle suivantes:
public static int EnsureDatabaseIsSeeded(this IApplicationBuilder applicationBuilder,
bool autoMigrateDatabase)
{
// seed the database using an extension method
using (var serviceScope = applicationBuilder.ApplicationServices
.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetService<DwContext>();
if (autoMigrateDatabase)
{
context.Database.Migrate();
}
return context.EnsureSeedData();
}
}
Mon DbContext est de type DwContext
qui est une classe qui étend le EF de Base DbContext
type
L' EnsureSeedData
extension de la méthode ressemble à ceci:
public static int EnsureSeedData(this DwContext context)
{
var bookCount = default(int);
var characterCount = default(int);
var bookSeriesCount = default(int);
// Because each of the following seed method needs to do a save
// (the data they're importing is relational), we need to call
// SaveAsync within each method.
// So let's keep tabs on the counts as they come back
var dbSeeder = new DatabaseSeeder(context);
if (!context.Books.Any())
{
var pathToSeedData = Path.Combine(Directory.GetCurrentDirectory(), "SeedData", "BookSeedData.json");
bookCount = dbSeeder.SeedBookEntitiesFromJson(pathToSeedData).Result;
}
if (!context.BookCharacters.Any())
{
characterCount = dbSeeder.SeedBookCharacterEntriesFromJson().Result;
}
if (!context.BookSeries.Any())
{
bookSeriesCount = dbSeeder.SeedBookSeriesEntriesFromJson().Result;
}
return bookCount + characterCount + bookSeriesCount;
}
Cette application est destinée à montrer les liens entre les livres, les personnages et les séries. C'est pourquoi il y a trois semoirs.
Et l'une de ces semoir méthodes ressemble à ceci:
public async Task<int> SeedBookEntitiesFromJson(string filePath)
{
if (string.IsNullOrWhiteSpace(filePath))
{
throw new ArgumentException($"Value of {filePath} must be supplied to {nameof(SeedBookEntitiesFromJson)}");
}
if (!File.Exists(filePath))
{
throw new ArgumentException($"The file { filePath} does not exist");
}
var dataSet = File.ReadAllText(filePath);
var seedData = JsonConvert.DeserializeObject<List<Book>>(dataSet);
// ensure that we only get the distinct books (based on their name)
var distinctSeedData = seedData.GroupBy(b => b.BookName).Select(b => b.First());
_context.Books.AddRange(distinctSeedData);
return await _context.SaveChangesAsync();
}
Il y a probablement un peu de code ici qui n'est pas grand, mais il pourrait être un point de départ pour vous de rebondir sur de.
Parce que les semoirs sont seulement appelés lorsque dans l'environnement de développement, vous aurez besoin de vous assurer que votre application commence de cette façon (si le démarrage à partir de la ligne de commande vous pouvez utiliser ASPNETCORE_ENVIRONMENT=Development dotnet run
pour s'assurer qu'il démarre en développement).
Cela signifie également que vous aurez besoin d'une approche différente à l'ensemencement de votre base de données en production. Dans dwCheckApi, j'ai un contrôleur qui peut être appelé pour les semences de la base de données (jetez un oeil à la DatabaseController de SeedData méthode pour voir comment je le faire).