2016-05-25 46 views
0

我有一个Web应用程序的解决方案。此应用程序使用实体框架和代码优先。然后我有第二个项目,一个控制台应用程序。该控制台应用程序共享保存迁移的程序集。停止运行迁移引用的dll

有没有办法让这个控制台应用程序永远不会运行Migrations?可能发生的情况是,该控制台应用程序将包含尚未在Web应用程序中部署的较新版本。我喜欢确保控制台不会破坏Web应用程序。更好的是让控制台不能更新数据库。

回答

0

设置数据库初始化器为空在DbContext构造:

public class ConsoleContext : DbContext 
{  public ConsoleContext() 
     : base("Name=" + Config.ConnectionStringName) 
    { 
     // Prevent attempt to initialize a database for this context 
     Database.SetInitializer<DtoContext>(null); 
    } 
} 

另外, 在你的web应用:

protected void Application_Start() 
{ 
    Database.SetInitializer<MyDbContext>(
     new MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>()); 
} 

,并在您的控制台应用程序:

protected void Application_Start() 
{ 
    Database.SetInitializer<DtoContext>(null); 
} 

而且,要更加确定地使用两种不同的方法数据库用户。如果您使用的是Sql Server,则Web应用程序需要db_datareader,db_datawriter和​​角色。控制台应用程序只应db_datareaderdb_datawriter角色,以防止它使用原始上下文注入到另一个类更改数据库架构

+0

I'm所以这不会工作 – Jepzen

+0

你可以在控制台应用程序使用不同的连接字符串与只具有读/写权限的不同数据库用户 – Colin

+0

是的,我只是在玩这个想法。仍然有兴趣看看是否有其他方式 – Jepzen

0

简单)是的,我有一个很好的解决方案。在Nuget控制台中,您必须为命令提供连接字符串和目标迁移:添加迁移/更新数据库。

需要代码)您也可以使用DbMigrator以编程方式执行此操作。