我正在实现一个基于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.
好吧,我最终得到了一个我不喜欢的解决方案。。。但这是有效的。我以这种方式修改了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参数...),在应用程序中,第二个构造函数被使用,但是我每次都必须传递应用程序名称。
如果有人有更好的解决方案,请张贴!
对于一些未知原因,您的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项目中,我添加了条令和迁移模块,并配置了条令和迁移配置。 现在我通过以下命令创建迁移 有人帮我吗有什么问题吗?