当前位置: 首页 > 知识库问答 >
问题:

实体框架手动迁移ConnectionStringName被DBContext基覆盖

谷光誉
2023-03-14

我正在实现一个基于ASP MVC 5和Entity Framework 6的Web应用程序。解决方案是按区域组织的(目前只有一个区域…)每个区域都有自己的DBContext。请参见解决方案图。

在DBContext中,我定义了一个在运行时分配给上下文的连接字符串名称,因为它依赖于登录变量。

using System.Web;
using RMC.Areas.TimeSheet.Controllers;

namespace RMC.Areas.TimeSheet.DAL
{
    public class timeSheetContext : DbContext
    {
        public timeSheetContext()
            : base("name=DBConn_Data." + RMC.Controllers.BaseController.applicationName + ".FLAT")
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<timeSheetContext, RMC.Areas.TimeSheet.Migrations.Configuration>(true));
        }


        public DbSet<ts_activityProfile> activityProfile { get; set; }                  // Profilo delle attività
        public DbSet<ts_activityProfile_ML> activityProfile_ML { get; set; }            // Profilo delle attività
        public DbSet<ts_activity> activity { get; set; }                                // Attività
etc...

当我尝试添加迁移或从控制台更新数据库时,即使我显式指定了连接字符串(并且连接字符串存在于主web.config中!),迁移工具也会尝试从DBContext: base...未定义运行时参数。

i、 e.指挥部

Add-MigrationMig000 -StartUpProjectName "RMC" -ProjectName "RMC" -ConfigurationTypeName "RMC.Areas.TimeSheet.Migrations.Configuration" -ConnectionStringName "DBConn_Data.re.FLAT" -Verbose

我得到的错误是:

No connection string named 'DBConn_Data..FLAT' could be found in the application config file.

它似乎忽略了传递的-ConnectionStringName。我让它工作的唯一方法是注释: base(...)定义。

-ConnectionStringName不应该覆盖:base()吗?我怎样才能让它发挥作用?

谢谢

编辑这里是BaseController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using System.Threading;
using RMC.Helpers;
using RMC.ViewModel;
using RMC.Models;
using RMC.ViewModel.navigation;


using System.Web.Configuration;


namespace RMC.Controllers
{
    [Authorize]
    public class BaseController : Controller
    {

        public static string applicationName = "";
        public static bool noValue = true;
        public static mLog oLog = null;
        public static string defaultCulture = "";       // Cultura di defautl del sistema impostata nel web.config

        protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {
            base.Initialize(requestContext);

            /* 20/02/2014
             Inizializzo la variabile statica che contiene l'application name.
             Viene utilizzata dal DBContext per trovare la connectionString corretta.
             */
            applicationName = System.Web.HttpContext.Current.Items["ApplicationName"].ToString();
etc...

有趣的是,如果我在命令中传递了一个错误的连接字符串名称,它会抱怨连接不存在!错误的命令

Update-Database -ConnectionStringName DBConn_Data.reXXX.FLAT -StartUpProjectName RMC -ProjectName RMC -ConfigurationTypeName RMC.Areas.TimeSheet.Migrations.Configuration -Verbose

错误消息

No connection string named 'DBConn_Data.reXXX.FLAT' could be found in the application config file.

共有2个答案

郤旭东
2023-03-14

好吧,我最终得到了一个我不喜欢的解决方案。。。但这是有效的。我以这种方式修改了DBContext

namespace RMC.Areas.TimeSheet.DAL
{
    public class timeSheetContext : DbContext
    {
        /* Used from Package Manager Console during manual Migrations */
        public timeSheetContext()
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<timeSheetContext, RMC.Areas.TimeSheet.Migrations.Configuration>(true));
        }

        /* Used by App. Must pass the application name every time !*/
        public timeSheetContext(string applicationName)
            : base("name=DBConn_Data." + applicationName + ".FLAT")
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<timeSheetContext, RMC.Areas.TimeSheet.Migrations.Configuration>(true));
        }

因此,当我运行手动迁移时,第一个构造函数被使用(传递-ConnectionStringName参数...),在应用程序中,第二个构造函数被使用,但是我每次都必须传递应用程序名称。

如果有人有更好的解决方案,请张贴!

裴姚石
2023-03-14

对于一些未知原因,您的RMC。控制器。BaseController。applicationName变量为空。这就是为什么您会收到异常消息

我的建议是,尝试将此变量移动到某个静态字段中,例如:

public static class Settings {
    public static string AppName = "MyApp";
}

您可以在您的上下文中使用它:

public timeSheetContext()
        : base("name=DBConn_Data." + Settings.AppName + ".FLAT")
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<timeSheetContext, RMC.Areas.TimeSheet.Migrations.Configuration>(true));
    }
 类似资料:
  • 我的迁移搞砸了,我在初始迁移时使用了,但现在我想删除所有的迁移,并从具有所有逻辑的初始迁移开始。 当我删除文件夹中的迁移并尝试时,它不会生成完整的文件(它是空的--因为自从上次(现在已删除)迁移以来,我没有做任何更改)。 是否有Disable-Migrations命令,以便我可以重新运行?

  • 在我们的生产环境中,我们有一个自动部署脚本,可以关闭站点,运行迁移,然后使其重新联机。我们希望在不需要运行任何迁移的情况下,通过切换到新代码来避免关闭站点。 实体框架是否有像“更新数据库”这样的命令,允许我们检查是否有迁移要运行?

  • 后来呢: 我从多个并发线程调用这样的代码来运行不同的查询…(在。NET Core3.0控制台应用程序中) 问题: 谢了!

  • 只有当解决方案具有多个引用EntityFramework的项目时,才会出现下面粘贴的错误。当运行“启用-迁移”或“添加-迁移”时,我收到以下错误:

  • This manual migration process should be run after the automated migration process, to complete the missing parts, or debug issues in the migration CLI output. Project setup package.json Scoped package

  • 在Zf3项目中,我添加了条令和迁移模块,并配置了条令和迁移配置。 现在我通过以下命令创建迁移 有人帮我吗有什么问题吗?