.NET实体框架代码优先迁移 - 数据库连接错误

时间:2012-07-12 19:44:29

标签: database connection migration entity

我正在构建一个应该有N DataContexts的项目。 我有一个Web应用程序,它将在App-Start(Global.asax)中执行以下步骤:

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

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

的登录失败

好的,所以此刻我检查数据库并创建了它,但__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
}

}

My Context class ..注意它定义了一个空数据库

 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在master数据库中创建表。

我们可以拥有N个服务器实例,并且在上下文之间仍然存在某种分离,但我仍然试图在同一个SQL实例中按上下文获取一个目录

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了一个解决方案..它不是最好的编码,但它现在正在工作。

我必须做的是

  1. 在我的项目中创建一个新的WCF服务层。
  2. 将“创建和更新”数据库工作移至服务类。
  3. 在业务逻辑层中,使用服务。
  4. 如果service.DoWork()方法失败,请再试一次(如前所述,它是第二次运行)
  5. 以下是BLL耗尽服务的代码

    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;
    
            }
    
    
        }
    }
    }
    
相关问题