Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Forçando o código primeiro a sempre inicializar um banco de dados inexistente?


Inicializador é executado quando você precisa acessar o banco de dados, portanto, se você deseja criar um banco de dados no início do aplicativo, use qualquer um dos seguintes:
    context.Database.Initialize(true); //If set to true the initializer is run even if it has already been run.       
    context.Database.Create()

http://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.103).aspx

Criar banco de dadosIfNotExists Uma implementação de IDatabaseInitializer que recriará e, opcionalmente, propagará novamente o banco de dados com dados somente se o banco de dados não existir. Para propagar o banco de dados, crie uma classe derivada e substitua o método Seed.
Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>());

http://msdn.microsoft.com/ pt-br/library/gg679221(v=vs.103).aspx

DropCreateDatabaseIfModelChanges Uma implementação de IDatabaseInitializer que excluirá, recriará e, opcionalmente, propagará novamente o banco de dados com dados somente se o modelo tiver sido alterado desde que o banco de dados foi criado. Isso é obtido gravando um hash do modelo de armazenamento no banco de dados quando ele é criado e, em seguida, comparando esse hash com um gerado a partir do modelo atual. Para propagar o banco de dados, crie uma classe derivada e substitua o método Seed.

Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

http://msdn.microsoft.com/ pt-br/library/gg679604(v=vs.103).aspx

DropCreateDatabaseAlways

Uma implementação de IDatabaseInitializer que sempre recriará e, opcionalmente, propagará novamente o banco de dados com dados na primeira vez que um contexto for usado no domínio do aplicativo. Para propagar o banco de dados, crie uma classe derivada e substitua o método Seed.
Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>());

http://msdn.microsoft.com/ pt-br/library/gg679506(v=vs.103).aspx

Eu recomendo que você veja Migrações se você quiser rastrear, reverta as alterações feitas em seu banco de dados para o estado anterior http ://msdn.microsoft.com/hr-hr/data/jj591621 .

ATUALIZAÇÃO
context.Database.Initialize(true);

Para aplicativos MVC, adicione uma seção ao Application_Start() método no Global.asax
protected void Application_Start() {

     Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>()); 

     // Forces initialization of database on model changes.
     using (var context= new MyContext()) {
          context.Database.Initialize(force: true);
     }    
}

Além disso, você pode usar um inicializador personalizado:
public class MyDbInit : DropCreateDatabaseAlways<MyContext>
{

}

e depois usar
Database.SetInitializer(new MyDbInit());

ATUALIZAÇÃO 2

Crie um novo aplicativo MVC4 vazio chamado DeleteDBOnEveryRequest .Coloque o seguinte em Global.asax Application_start
protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            Database.SetInitializer<BlogContext>(new DropCreateDatabaseAlways<BlogContext>());    

            using (var context = new BlogContext())
            {
                context.Database.Initialize(force: true);
            }    
        }

Crie um novo controlador chamado DatabaseController com duas ações.

No Acesso ação você exclui o banco de dados e redireciona para Recriado ação de onde você cria um banco de dados como foi excluído anteriormente.
namespace DeleteDBOnEveryRequest.Controllers
{
    public class DatabaseController : Controller
    {
        public ActionResult Access()
        {
            using (var context = new BlogContext())
            {
                context.Database.Delete();
            } 
            return RedirectToAction("Recreated");
        }

        public ActionResult Recreated()
        {
            using (var context = new BlogContext())
            {
                context.Database.Initialize(force: true);                
            }
            return View();
        }
    }
}

É isto o que você queria?