2012-07-12 134 views
1

建立一个应该有N个DataContexts的项目。 我有一个web应用程序,将执行以下步骤中的应用程序开始(Global.asax):.NET实体框架代码优先迁移 - 数据库连接错误

1 - 如果数据库不存在,创建。 2 - 将数据库更新到最新的迁移。

当我第一次运行应用程序(数据库尚未创建)时,我得到一个执行选项“无法打开数据库”DBName“请求登录。登录失败。 用户登录失败'sa' “。

好的,所以在这一刻我检查数据库并创建它,但__Migrations表不存在。

如果我停止应用程序并再次运行该应用程序,则不会抛出异常并且数据库已成功更新。

我试着在连接字符串中设置持久安全信息,但没有任何变化。

我的代码如下: 的Global.asax

void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 
     Bll.AppStart.Databases.Start(); 

    } 

调用..

namespace BusinessLogicLayer.AppStart 
{ 
/// <summary> 
/// Inicialização e Update de versão dos bancos de dados do sistema 
/// </summary> 
public static class Databases 
{ 
    public static void Start() 
    { 
     //Iniciar DBCore 
     DataBaseStart<DataAccessLayer.DataContexts.Core.Context, 
      DataAccessLayer.Migrations.Core.Configuration>(); 
    } 

    #region Inicializar bancos de dados 

    private static void DataBaseStart<T, TC>() 
     where T : DbContext, new() 
     where TC : DbMigrationsConfiguration<T>, new() 
    { 


     //Atualiza a base de dados com base na configuração do migrations 
     try 
     { 

      var migratorConfig = new TC(); 
      var dbMigrator = new DbMigrator(migratorConfig); 
      dbMigrator.Configuration.AutomaticMigrationDataLossAllowed = false; 
      dbMigrator.Update(); 

     } 
     catch (Exception) 
     { 
      //Exceção quando cria o banco a primeira vez? 


      throw new Exception("Banco de dados criado pela primeira vez. Reinicie a aplicação."); 




     } 


    } 

    #endregion 
} 

}

我的上下文类..注意到它定义了一个空数据库

public class Context : DbContext 
{ 

    public Context() 
    { 
     Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["PODBCore"].ConnectionString; 

    } 
    public Context(string connectionString) 
    { 
     Database.Connection.ConnectionString = connectionString; 

    } 





} 

我的迁移配置类

public sealed class Configuration : DbMigrationsConfiguration<DataContexts.Core.Context> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 
    } 

    protected override void Seed(DataContexts.Core.Context context) 
    { 
     // This method will be called after migrating to the latest version. 

    } 
} 

我有一个定义的空模型

public partial class Initial : DbMigration 
{ 
    public override void Up() 
    { 
    } 

    public override void Down() 
    { 
    } 
} 

只是要记住,如果我跑两次数据库已成功创建并更新aplication(我做测试初始迁移与其他迁移,创建表和东西)。 异常仅在应用程序首次运行时抛出,并且数据库不存在。

我还试图在运行迁移更新代码之前调用Database.SetInitializer和context.CreateIfNotExist()。

编辑:

伊夫检查SQL Server日志,基本的应用程序试图连接到连接字符串中指定初始目录,但它不存在。在引发异常之后,数据库被创建并在线。

编辑:

如果我删除初始目录属性它将工作,但我有我的所有dataContexts创建在主数据库中的表。

我们可以有N个服务器实例,仍然有某种上下文,但我还在试图让一个目录上下文在同一个SQL实例

回答

0

好之间的分离,让我找到了解决这个..它不是最好的编码,但现在它的工作。

什么,我要做的就是

  1. 建立在我的项目一个新的WCF服务层。
  2. 将“创建&更新”数据库工作移至服务类。
  3. 在业务逻辑层,使用该服务。
  4. 如果service.DoWork()方法失败,再尝试(正如我之前所说的,它的作品第二次)

这里是BLL代码consumig服务

using BusinessLogicLayer.WcfServicesLayer.AppStart.Databases; 

namespace BusinessLogicLayer.AppStart 
{ 
    /// <summary> 
    /// Inicialização e Update de versão dos bancos de dados do sistema 
    /// </summary> 
    public static class Databases 
    { 
    public static void Start() 
    { 
     //Iniciar DBCore 
     var client = new DatabasesClient(); 
     bool databaseStarted = client.DoWork(); 
     if(!databaseStarted) 
     { 
      var retry = new DatabasesClient(); 
      databaseStarted = retry.DoWork(); 
     } 

    } 


    } 
    } 

这里是服务类。

using System; 
using System.Data.Entity; 
using System.Data.Entity.Migrations; 
namespace WcfServicesLayer.AppStart 
{ 
// Serviço de inicialização dos bancos de dados da aplicação 
public class Databases : IDatabases 
{ 
    public bool DoWork() 
    { 
     return StartDatabases(); 
    } 

    private bool StartDatabases() 
    { 

     //Iniciar DBCore 
     return DataBaseStart<DataAccessLayer.DataContexts.Core.Context, 
      DataAccessLayer.Migrations.Core.Configuration>(); 

    } 

    private bool DataBaseStart<T, TC>() 
     where T : DbContext, new() 
     where TC : DbMigrationsConfiguration<T>, new() 
    { 


     //Atualiza a base de dados com base na configuração do migrations 
     try 
     { 
      var migratorConfig = new TC(); 
      var dbMigrator = new DbMigrator(migratorConfig); 
      dbMigrator.Configuration.AutomaticMigrationDataLossAllowed = false; 

      dbMigrator.Update(); 
      return true; 
     } 
     catch (Exception) 
     { 
      //Exceção quando cria o banco a primeira vez? 
      return false; 

     } 


    } 
} 
} 
相关问题