不能在运行时设置DbContext连接字符串并将项目与应用程序分开的情况下运行EF迁移
本文关键字:应用程序 情况下 迁移 EF 运行 项目 设置 运行时 DbContext 连接 串并 | 更新日期: 2023-09-27 18:11:57
我有一个类库项目,其中有一个DbContext类,看起来像这样:
public DbContext() : base(ContextInitializer.GetConnectionStringName())
{
以便用户(其他程序员)可以在他们的应用程序启动时设置这个,当他们可以在任何项目中选择的任何数据库上使用我的API和实体时,然后设置连接字符串。现在我正在尝试在我的类库中生成迁移配置。我试过:
Enable-Migrations -ProjectName "ClassLibraryProject" -ContextTypeName "MyDbContext" -StartUpProjectName "MyWebApp" -ConnectionString "MyConnectionString" -ConnectionProviderName "System.Data.SqlClient"
根据这里遇到同样错误的其他人的答案,它没有帮助。我仍然得到:
异常调用带有"2"参数的"SetData": "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation。汇编中的OAProject"Microsoft.VisualStudio.ProjectSystem.VS。实现,版本=14.1.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'未标记为可序列化的。"在C:'Users'me.nuget'packages' EntityFramework ' 6.1.3 ' ' EntityFramework工具。psm1:718 char: 5+ $域。SetData("项目",项目美元)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo: NotSpecified:(:) [], MethodInvocationException+ fulllyqualifiederrid: SerializationException
异常调用带有"2"参数的"SetData": "类型"Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject"Microsoft.VisualStudio.ProjectSystem.VS.Implementation汇编版本=14.1.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' is未标记为可序列化。"在C:'Users'me.nuget'packages' EntityFramework ' 6.1.3 ' ' EntityFramework.psm1:719工具字符:5+ $域。SetData (contextProject, contextProject美元)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo: NotSpecified:(:) [], MethodInvocationException+ fulllyqualifiederrid: SerializationException
异常调用带有"2"参数的"SetData": "类型"Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject"Microsoft.VisualStudio.ProjectSystem.VS.Implementation汇编版本=14.1.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' is未标记为可序列化。"在C:'Users'me.nuget'packages' EntityFramework ' 6.1.3 ' ' EntityFramework.psm1:720工具字符:5+ $域。SetData (startUpProject, startUpProject美元)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo: NotSpecified:(:) [], MethodInvocationException+ fulllyqualifiederrid: SerializationException
我在这里看到的其他答案说使用-StartUpProjectName参数,我这样做了,但仍然得到错误。我认为这是因为我的项目在我正在工作的解决方案中的嵌套文件夹中,但是提供项目名称为"path/ProjectName"触发了一个项目未找到的错误,所以不能是它。
编辑:我发现这个:EF 6与dnx项目,我的项目是Asp。. NET Core类库的目标是461运行时,并在Asp. NET中使用。因此,没有办法在类库中运行迁移使用EF 6与ASP。网络核心?
好了,经过仔细观察,默认情况下您不能这样做。从一月份开始就没有类库的工具了,这对我来说太可怕了。没有工具,因为我发布的链接提到使用EF6针对461的。net CORE类库,因为EF6工具不识别项目。Json依赖项格式。
然而,幸运的是,一位名叫Mohammad Rahhal的绅士创建了这样一个图书馆来完成这个任务:https://github.com/mrahhal/Migrator.EF6/blob/master/README.md
并使用本期所描述的信息:https://github.com/mrahhal/Migrator.EF6/issues/9
我能够成功地运行一个迁移,它确实需要一些黑客的东西,但它暂时有效,比其他地方提供的其他替代方案要好。
1)为migration . ef6下载这个nuget包。nuget工具。
2)变更项目。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存根的program.cs文件到类库项目中:
public class Program
{
public static void Main(string[] args)
{
}
}
您现在被设置为从VS2015 Dev命令提示符运行迁移。导航到项目目录,并运行上面链接的自述文件中描述的迁移命令。
但是,应该注意的是,一旦您完成了迁移,将emitEntryPoint
值再次设置为false,这样它仍然可以被视为正常的类库。基本上,你是在欺骗EF工具,让它认为你的类库是一个控制台应用程序,但你不希望它在部署时被这样对待。
确保 MyWebApp web。配置一个名为MyConnectionString
的连接字符串。
Enable-Migrations
-ProjectName "ClassLibraryProject"
-ContextTypeName "MyDbContext"
-StartUpProjectName "MyWebApp"
-ConnectionString "MyConnectionString"
-ConnectionProviderName "System.Data.SqlClient"
我正在使用Visual Studio 2017
我能够成功运行迁移的地方,它需要什么在DbContext所在的类库中安装以下NuGet包
微软。EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore。工具
我今天早上有同样的问题,我更新了EF nuget包到实体框架6.3.0。帮助。