如何动态更改EF的DBContext的连接字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何动态更改EF的DBContext的连接字符串相关的知识,希望对你有一定的参考价值。

为了实现程序在运行时同时管理多个数据库,需要动态修改连接字符串。方法如下:
1. 修改Settings.Designer.cs的连接字符串,把只读属性改为可读写。注意,在新添加配置数据时,IDE会把你添加的内容删除。还需再次添加。
public string ConnectionString get
return ((string)(this["ConnectionString"]));//此为新添加的。set
this["ConnectionString"] = value;
2. 在实例化适配器前修改字符串。
参考技术A . /\7    ∠_/
  / │   / /
 │ Z _,< /   /`ヽ
 │     ヽ   /  〉
  Y     `  /  /
 イ● 、 ●  ⊂⊃〈  /
 ()  へ    | \〈
  >ー 、_  ィ  │ //
  / へ   / ノ<| \\
  ヽ_ノ  (_/  │//
  7       |/
  >―r ̄ ̄`ー―_

无法在运行时设置 DbContext 连接字符串并将项目与应用程序分开的情况下运行 EF 迁移

【中文标题】无法在运行时设置 DbContext 连接字符串并将项目与应用程序分开的情况下运行 EF 迁移【英文标题】:Can't run EF migration where DbContext connection string is set at runtime and separate project from application 【发布时间】:2017-02-14 11:29:33 【问题描述】:

我有一个类库项目,其中有一个 DbContext 类,如下所示:

public DbContext() : base(ContextInitializer.GetConnectionStringName())
    

这样用户(其他程序员)可以在他们的应用程序启动时设置这个,当他们可以在他们在任何项目中选择的任何数据库上使用我的 API 和实体时,然后设置连接字符串。现在我正在尝试在我的类库中生成迁移配置。我试过了:

Enable-Migrations -ProjectName "ClassLibraryProject" -ContextTypeName "MyDbContext" -StartUpProjectName "MyWebApp" -ConnectionString "MyConnectionString" -ConnectionProviderName "System.Data.SqlClient"

基于此处遇到相同错误的其他答案,但无济于事。我仍然得到:

使用“2”参数调用“SetData”的异常:“在程序集中键入“Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject” 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 未标记为可序列化。” 在 C:\Users\me.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:718 char:5 + $domain.SetData('project', $project) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : 序列化异常

使用“2”个参数调用“SetData”的异常:“类型 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' 在程序集'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, 版本=14.1.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 是 未标记为可序列化。”在 C:\Users\me.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:719 字符:5 + $domain.SetData('contextProject', $contextProject) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : 序列化异常

使用“2”个参数调用“SetData”的异常:“类型 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' 在程序集'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, 版本=14.1.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 是 未标记为可序列化。”在 C:\Users\me.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:720 字符:5 + $domain.SetData('startUpProject', $startUpProject) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : 序列化异常

我在这里看到的其他答案说使用 -StartUpProjectName 参数,我这样做了,但仍然得到错误。我认为这是因为我的项目位于我正在使用的解决方案中的嵌套文件夹中,但是将项目名称提供为“路径/项目名称”会触发一个错误,即找不到项目,所以不可能。

编辑:我发现了这个:EF 6 with a dnx project,我的项目是面向 461 运行时的 Asp.NET Core 类库,并在 Asp.NET Core Web 应用程序中使用。所以没有办法在使用 EF 6 和 ASP.NET Core 的类库中运行迁移?

【问题讨论】:

【参考方案1】:

好的,所以看了很多之后,默认情况下你不能这样做。自 1 月以来,类库完全没有任何工具,这对我来说似乎很可怕。并且没有工具作为我发布的链接提到使用 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

我能够成功运行迁移,它确实需要一些 hacky 的东西,但它暂时有效,比其他地方提供的其他替代方案更好。

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 开发命令提示符运行迁移。导航到项目目录,然后运行上面链接的自述文件中描述的迁移命令。

但是,应该注意的是,一旦你完成了迁移的运行,再次将emitEntryPoint 的值设置为 false,这样它仍然可以像普通的类库一样对待。基本上你是在欺骗 EF 工具,认为你的类库是一个控制台应用程序,但你不希望它在部署时被这样对待。

【讨论】:

【参考方案2】:

确保 MyWebApp 有一个带有名为 MyConnectionString 的连接字符串的 web.config。

Enable-Migrations 
    -ProjectName "ClassLibraryProject" 
    -ContextTypeName "MyDbContext" 
    -StartUpProjectName "MyWebApp" 
    -ConnectionString "MyConnectionString" 
    -ConnectionProviderName "System.Data.SqlClient"

【讨论】:

确实如此,不是这样。【参考方案3】:

我正在使用 Visual Studio 2017 我能够成功运行迁移的地方,它确实需要 在 DbContext 所在的类库中安装以下 NuGet 包

Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Tools

【讨论】:

【参考方案4】:

今天早上我遇到了同样的问题,我将 EF nuget 包更新为 Entity Framework 6.3.0。这有帮助。

【讨论】:

以上是关于如何动态更改EF的DBContext的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

EF6 DBContext 动态连接字符串

如何从 EF7 DbContext 获取 ConnectionString

EF+Sqlite 动态设置连接字符串

无法在运行时设置 DbContext 连接字符串并将项目与应用程序分开的情况下运行 EF 迁移

.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串

C#中如何设置字符串连接到MySQL数据库?