2012-07-12 4 views
1

N DataContexts가 있어야하는 프로젝트를 빌드하고 있습니다. App-Start (Global.asax)에서 아래 단계를 수행 할 웹 응용 프로그램이 있습니다..NET Entity Framework 코드 첫 마이그레이션 - 데이터베이스 연결 오류

1 - 데이터베이스가 없으면 만듭니다. 2 - 데이터베이스를 최신 마이그레이션으로 업데이트하십시오.

처음으로 응용 프로그램을 실행할 때 (데이터베이스가 아직 생성되지 않은 경우) "데이터베이스를 열 수 없습니다"라는 로그인이 DB_NAME을 열 수 없습니다. 로그인하지 못했습니다 .. 'sa'사용자가 로그인하지 못했습니다. . "

좋아, 그래서 지금은 내가 databse 확인하고 만들어집니다,하지만 __Migrations 테이블이 없습니다.

응용 프로그램을 중지하고 다시 실행하면 예외가 throw되지 않고 데이터베이스가 성공적으로 업데이트됩니다.

필자는 연결 문자열에 영구 보안 정보를 설정하려고했지만 아무것도 변경하지 않았습니다.

내 코드는 다음과 같습니다 : 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을 실행하면 그냥 기억 (내가 한 테스트를 정의하는 초기 마이그레이션이 다른 마이그레이션과 함께 테이블 및 항목 생성). 응용 프로그램이 처음 실행되고 데이터베이스가 존재하지 않는 경우에만 예외가 throw됩니다.

Ive도 마이그레이션 업데이트 코드를 실행하기 전에 Database.SetInitializer 및 context.CreateIfNotExist()를 호출하려고했습니다.

편집 :

는 필자는 기본적으로 응용 프로그램이 연결 문자열에 지정된 초기 카탈로그에 연결을 시도, SQL 서버 로그를 확인하지만 존재하지 않습니다. excpetion이 던져지면 데이터베이스가 생성되고 온라인 상태가됩니다.

편집 :

i는 초기 카탈로그 속성을 제거하면 그것은 작동하지만 다음 내가 마스터 데이터베이스에서 테이블을 만드는 내 모든 dataContexts있을 것입니다.

우리는 N 서버 인스턴스가 여전히 컨텍스트하지만 메신저는 여전히 같은 SQL 인스턴스를 확인

답변

0

에 문맥에 의해 하나의 카탈로그를 얻으려고 노력 사이의 분리의 어떤 종류, 그래서 나는이에 대한 해결책을 찾을 수 ..코드화 된 것이 아니라 현재 작동합니다. 내가해야 할 일을했을 무엇

  1. 내 프로젝트에 새로운 WCF 서비스 레이어를 작성했다.
  2. "& 업데이트 만들기"데이터베이스 작업을 서비스 클래스로 이동하십시오.
  3. 비즈니스 로직 계층에서 서비스를 사용하십시오. service.DoWork() 메소드가 실패하면
  4. , 여기

는 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(); 
     } 

    } 


    } 
    } 

여기에 서비스를 consumig입니다 (내가 전에 말했듯이, 그것은 두 번째로 작동) 다시 시도 서비스 클래스입니다.

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; 

     } 


    } 
} 
} 
관련 문제