tl;dr:看看我的dwCheckApi project,看看我是如何实现它的。
正如其他人所说,您可以从 JSON 或类似文件中读取您的种子数据(如果您愿意,它可以进行源代码控制)。
我在项目中实现它的方式是在 Startup 类的 Configure 方法中调用一个方法(仅在开发时):
if (env.IsDevelopment())
{
app.EnsureDatabaseIsSeeded(false);
}
调用如下:
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();
}
}
我的 DbContext 是 DwContext 类型,这是一个扩展 EF Core DbContext 类型的类
EnsureSeedData 扩展方法如下所示:
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;
}
此应用程序旨在显示书籍、角色和系列之间的关系。这就是为什么有三个播种机的原因。
其中一种播种器方法如下所示:
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();
}
这里可能有一些代码不是很好,但它可能是你反弹的起点。
因为播种器仅在开发环境中被调用,所以您需要确保您的应用程序以这种方式启动(如果从命令行启动,您可以使用ASPNETCORE_ENVIRONMENT=Development dotnet run 来确保它在开发环境中启动)。
这也意味着您需要一种不同的方法来为生产环境中的数据库播种。在 dwCheckApi 中,我有一个控制器,可以调用它来为数据库播种(查看 DatabaseController's SeedData method 以了解我是如何做到的)。