我在向.NET Core类库中的Entity Framework数据库上下文添加初始迁移时遇到问题。
当我跑步时:
dotnet ef migrations add migrationName -c PlaceholderContext
我收到错误:
Could not invoke this command on the startup project 'Placeholder.Data'. This version of the Entity Framework Core .NET Command Line Tools does not support commands on class library projects in ASP.NET Core and .NET Core applications. See http://go.microsoft.com/fwlink/?LinkId=798221 for details and workarounds.
所以我点击link并了解到无法将迁移添加到类库中。但是,您可以将类库项目转换为" app"项目,但通过这样做,我不能参考这个" app"来自我的业务层(类库)的项目。
项目结构:
Placeholder.Web (WebAPI)=> Placeholder.Business (类库)=> Placeholder.Data (类库)
Placeholder.Web => Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
//HERE WE REGISTER DB CONTEXT, (STATIC CLASS IN BUSINESS LAYER)
services.InjectBusinessContext(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=Placeholder;Integrated Security=True;Connect Timeout=30;");
services.InjectWebServices();
services.InjectBusinessServices();
}
如何克服这个令人烦恼的问题?
更新(1)
我已将我的Placeholder.Data类库转换为" app"用静态主方法。因为我不能再从Placeholder.Business引用Placeholder.Data我必须使用microsoft doc页面上列出的解决方法2。当我现在运行迁移脚本时,我得到以下内容:
没有为此DbContext配置数据库提供程序。一个 可以通过覆盖DbContext.OnConfiguring来配置提供程序 方法或在应用程序服务提供程序上使用AddDbContext。 如果使用AddDbContext,那么还要确保您的DbContext类型 接受一个 DbContextOptions对象在其构造函数中,并将其传递给DbContext的基础构造函数
Doh ofcourse这不会工作,dbcontext是从我的Placeholder.Web应用程序注册的(通过业务层)。那么我唯一的选择是在新的静态main方法中添加一个新的上下文,我真的不想这样做..
答案 0 :(得分:7)
您无需将数据项目“转换”为应用。这是一个具有类似结构的测试应用程序:
在Data项目的project.json中,添加asp.net核心nuget包。
现在,要创建迁移,只需右键单击Data项目,选择'在文件资源管理器中打开文件夹',然后在文件资源管理器中,按Shift +右键单击并在此处打开命令窗口。
要创建迁移,只需将“启动项目”指定为Web应用程序(startup.cs所在的位置)
dotnet ef --startup-project ../TestPatterns2.Web migrations add Second
瞧,迁移:
将移民文件夹添加到数据项目中: 定义服务时,添加迁移点,如此
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("TestPatterns2.Data")));
答案 1 :(得分:1)
它只需要是一个用于进行迁移的应用程序(需要一个入口点),因此在将库作为应用程序并创建迁移之后,请注释掉项目中的buildOptions
和runtimes
元素以.json。它现在将再次构建为库。
每当您需要添加其他迁移时,请取消注释。