我有一个类库项目,其中包含一个DbContext类,如下所示:
public DbContext() : base(ContextInitializer.GetConnectionStringName())
{
这样,当用户(其他程序员)可以在我在任何项目中选择的任何数据库上使用我的API和实体并设置连接字符串时,都可以在其应用程序启动时进行设置。现在,我试图在类库中生成迁移配置。我试过了:
Enable-Migrations -ProjectName "ClassLibraryProject" -ContextTypeName "MyDbContext" -StartUpProjectName "MyWebApp" -ConnectionString "MyConnectionString" -ConnectionProviderName "System.Data.SqlClient"
根据此处遇到相同错误的其他答案,这无济于事。我仍然得到:
我在这里看到的其他答案说使用-StartUpProjectName参数,我这样做了,但仍然收到错误。我以为是因为我的项目在我正在使用的解决方案中的嵌套文件夹中,但是将项目名称提供为“path/ProjectName”会触发一个错误,即找不到项目,所以不能这样。
编辑:我发现了这一点:EF 6 with a dnx project,我的项目是目标为461运行时的Asp.NET Core类库,并在Asp.NET Core Web应用程序中使用。因此,没有办法使用带有ASP.NET Core的EF 6在类库中运行迁移吗?
最佳答案
好吧,经过一番尝试,默认情况下您无法执行此操作。自一月份以来,根本没有用于类库的工具,这对我来说似乎很可怕。我发布的链接中没有任何工具提到使用EF6定位到461的.NET CORE类库,因为EF6工具无法识别project.json依赖格式。
然而,幸运的是,一个名叫穆罕默德·拉哈尔(Mohammad Rahhal)的绅士创建了一个这样的库来完成此任务:https://github.com/mrahhal/Migrator.EF6/blob/master/README.md
并使用本期中描述的信息:https://github.com/mrahhal/Migrator.EF6/issues/9
我能够成功运行迁移,它确实需要一些骇人听闻的东西,但是暂时可以运行,比其他地方提供的其他替代方法要好。
1)为Migrator.EF6.Tools nuget下载此nuget软件包。
2)将project.json更改为包括:
{
"version": "1.0.0-*",
"dependencies": {
"EntityFramework": "6.1.3",
"Migrator.EF6.Tools": "1.0.5"
},
"frameworks": {
"net461": {}
},
"buildOptions": {
"emitEntryPoint": true
},
"tools": {
"Migrator.EF6.Tools": {
"imports": "portable-net45+win8+dnxcore50",
"version": "1.0.5"
}
}
}
3)将带有Main stub 的program.cs文件添加到类库项目中:
public class Program
{
public static void Main(string[] args)
{
}
}
现在,您已设置为从VS2015 Dev Command Prompt运行迁移。导航到项目目录,然后运行上面自述文件中描述的迁移命令。
但是,应该注意的是,一旦完成了运行迁移,就可以再次将
emitEntryPoint
值设置为false,以便仍可以将其视为普通的类库。基本上,您是在欺骗EF工具以使您的类库是一个控制台应用程序,但是您不希望将其像部署时那样对待。