C# ASP.NET核心RC2种子数据库
我的问题是,我正试图用数据来创建一个实体框架核心数据库,在我看来,下面的代码展示了我的工作。我意识到这不应该在C# ASP.NET核心RC2种子数据库,c#,asp.net-core,entity-framework-core,asp.net-core-1.0,C#,Asp.net Core,Entity Framework Core,Asp.net Core 1.0,我的问题是,我正试图用数据来创建一个实体框架核心数据库,在我看来,下面的代码展示了我的工作。我意识到这不应该在ApplicationDbContext构造函数中调用,而应该从启动中调用,但我不知道如何做到这一点 编辑:基于Ketrex提供的解决方案,我的解决方案如下: Startup.cs: public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactor
ApplicationDbContext
构造函数中调用,而应该从启动
中调用,但我不知道如何做到这一点
编辑:基于Ketrex提供的解决方案,我的解决方案如下:
Startup.cs:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.ApplicationServices.GetRequiredService<ApplicationDbContext>().Seed();
}
我知道在EntityFramework的优先级列表中,创建一个数据库是非常重要的,但是如果有一些关于如何实现这个琐碎任务的文档,或者至少提供一个临时解决方案,那就太好了。如果有人能提供一些指导如何做到这一点,将不胜感激。我觉得我已经接近一个解决方案了,但就是不能把它拼凑起来
谢谢您的帮助。假设您使用的是内置DI容器,这里有一种方法可以实现这一点 在启动类的Configure方法中引用种子方法,并将IAApplicationBuilder对象作为参数而不是DbContext传递,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//...
// Put this at the end of your configure method
DbContextSeedData.Seed(app);
}
public static void Seed(IApplicationBuilder app)
{
// Get an instance of the DbContext from the DI container
using (var context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>())
{
// perform database delete
context.Database.EnsureDeleted;
//... perform other seed operations
}
}
接下来,修改种子方法以接受IAApplicationBuilder实例。然后,您将能够启动DbContext的实例,并执行种子操作,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//...
// Put this at the end of your configure method
DbContextSeedData.Seed(app);
}
public static void Seed(IApplicationBuilder app)
{
// Get an instance of the DbContext from the DI container
using (var context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>())
{
// perform database delete
context.Database.EnsureDeleted;
//... perform other seed operations
}
}
publicstaticvoidseed(iaapplicationbuilder应用程序)
{
//从DI容器获取DbContext的实例
使用(var context=app.ApplicationServices.GetRequiredService())
{
//执行数据库删除
context.Database.cn已删除;
//…执行其他种子操作
}
}
您还可以使用Startup.csConfigureServices
方法使ApplicationDbContext可用(将dbcontext注册为服务):
最后,seed方法可以对一个重要的表进行快速检查,因为重新创建数据库可能太重了:
public void Seed()
{
//....
if(context.Countries.Any())
return;
//...
}
我希望它能帮助您或其他人,至少作为另一种选择。如果您想从单独的类库运行EF代码并进行种子设定,您可以执行以下操作。这是使用TSQL (一) 创建一个新类库。 使用NuGet添加以下依赖项
Microsoft.AspNetCore
Microsoft.AspNetCore.Identity.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
2) 将包管理器控制台指向此项目并运行
PM> add-migration Seeder01
然后
PM> update-database
这将为您提供一个空迁移
3) 将更新脚本编写为类似于
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using System.IO;
namespace Test02.Data.Migrations
{
public partial class Seeder01 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
string sql = string.Empty;
sql = "SET IDENTITY_INSERT State ON;";
sql += "Insert into State (Id, Name) values ";
sql += "(2, 'NSW'),";
sql += "(3, 'VIC'),";
sql += "(4, 'QLD'),";
sql += "(5, 'SA')";
sql += ";";
sql += "SET IDENTITY_INSERT State OFF;";
migrationBuilder.Sql(sql);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
string sql = string.Empty;
sql = "delete State;";
migrationBuilder.Sql(sql);
}
}
}
4) 使用…还原到以前的迁移
PM> add-migration {PriorMigrationName}
重新加载种子迁移并更新数据库
PM> add-migration Seeder01
PM> update-database
非常感谢你!我缺少的是这一行
app.ApplicationServices.GetRequiredService()
。我稍微修改了您的解决方案,将其用作扩展方法。@MohammadAkbari您似乎在吹毛求疵。请注意//。。。是否执行其他种子操作?这显然意味着他可能还有其他手术要做。这里解决的问题是将上下文注入seed方法。请注意服务定位器反模式,但同时也有很好的解决方法。我期待EF Core获得更多功能,以便在产品中使用。我最终使用了公共静态IApplicationBuilder种子(此IApplicationBuilder应用程序)
,这样我的初创公司就可以使用app.Seed()代码>我是一个非常新手,并且非常仔细地遵循这个字符串,但是不断地得到一个关于作用域的运行时错误。找到并进行了此更改(我使用的是core 2.1 RC)。公共静态IWebHost BuildWebHost(字符串[]args)=>WebHost.CreateDefaultBuilder(args)。UseStartup().UseDefaultServiceProvider(选项=>options.ValidateScopes=false)()
PM> add-migration Seeder01
PM> update-database