A veces, me voy a borrar de mi base de datos de desarrollo y ejecutar mi EF código-primera aplicación. Voy a conseguir el error:

No se puede abrir la base de datos «AssessmentSystem» solicitada por el inicio de sesión. El error de inicio de sesión.
Error de inicio de sesión del usuario ‘AssessmentAdmin’.

Creo que esto es debido a que el DbContext sólo se ejecuta la inicialización de base de datos lógica «de una vez por dominio de aplicación cuando el contexto se utiliza por primera vez», como esta página dice. Esto significa que se necesita para reciclar el grupo de aplicaciones de IIS para obtener EF para volver a crear mi base de datos si la dejo.

¿Hay alguna manera de obtener la inicialización de base de datos a la ejecución de código cada vez intento acceder a la base de datos? Por lo tanto, será siempre revise para ver si la base de datos existe y si no existe, cree que en lugar de intentar abrirlo, incluso si se trata de utilizar el mismo dominio de aplicación que previamente tiene acceso a la base de datos que ahora he caído?

Nota que me gustaría que esta initializtion de verificación debe hacerse en cada consulta, por lo que incluso si lo hace en Application_Start no es a menudo suficiente; idealmente, me gustaría ser capaz de cargar algunos DB datos, eliminar la base de datos, a continuación, cargar algunos DB de datos y se creará la base de datos sin siquiera tener que reiniciar la aplicación (básicamente acabo de tener que volver a cargar la página web que se carga algunas DB de datos).

InformationsquelleAutor Jez | 2012-10-04

1 Comentario

  1. 35

    Inicializador se ejecuta cuando se necesita acceder a la base de datos así que si usted desea crear una base de datos en la aplicación de empezar a usar cualquier cosa de las siguientes:

        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

    CreateDatabaseIfNotExists
    Una implementación de IDatabaseInitializer que recreará y, opcionalmente, re-semilla de la base de datos con datos si la base de datos no existe. Para inicializar la base de datos, crear una clase derivada y anular la Semilla método.

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

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

    DropCreateDatabaseIfModelChanges
    Una implementación de IDatabaseInitializerthat va a eliminar, recrear, y, opcionalmente, re-semilla de la base de datos con datos sólo si el modelo ha cambiado desde la base de datos fue creada. Esto se logra mediante la escritura de un hash de la tienda de modelo a la base de datos cuando se crea y, a continuación, comparando ese hash generados a partir del modelo actual. Para inicializar la base de datos, crear una clase derivada y anular la Semilla método.

    La inicialización de la estrategia, opcionalmente, puede comprobar la base de datos
    existencia, crear una nueva base de datos, y la semilla de la base de datos con los datos. El
    por defecto estrategia es una instancia de
    CreateDatabaseIfNotExists.

    De la base de datos.SetInitializer(nueva DropCreateDatabaseIfModelChanges());

    Tenga en cuenta que esto asume que usted tiene permiso para incluso la caída de su base de datos.

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

    DropCreateDatabaseAlways

    Una implementación de IDatabaseInitializer que siempre va a recrear y, opcionalmente, re-semilla de la base de datos con los datos de la primera vez que un contexto es utilizado en el dominio de la aplicación. Para inicializar la base de datos, crear una clase derivada y anular la Semilla método.

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

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

    Recomiendo que mires el Migraciones si desea realizar un seguimiento, revertir los cambios realizados en la base de datos para el estado anterior http://msdn.microsoft.com/hr-hr/data/jj591621 .

    ACTUALIZACIÓN

    context.Database.Initialize(true);

    Si el parámetro de la fuerza se establece en true, entonces el inicializador de que se ejecute
    independientemente de si o no se ha ejecutado antes. Esto puede ser
    útil si una base de datos se elimina mientras se ejecuta la aplicación y las necesidades de
    reinicializarse.

    Para la aplicación de MVC agregar una sección a la Application_Start() método en el 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);
         }    
    }

    También puede utilizar una costumbre de inicializador :

    public class MyDbInit : DropCreateDatabaseAlways<MyContext>
    {
    
    }

    y, a continuación, utilizar

    Database.SetInitializer(new MyDbInit());

    ACTUALIZACIÓN 2

    Hacer un nuevo vacío de MVC4 aplicación llamada DeleteDBOnEveryRequest.
    Pon lo siguiente en el Mundial.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);
                }    
            }

    Hacer un nuevo controlador llamado DatabaseController con dos acciones.

    En el Acceso acción de eliminar la DB y redirigir a Recreado de acción desde donde puede crear una DB como era previousy eliminado.

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

    Es esto lo que quería?

    • No; Initializer sólo se ejecuta una vez por cada dominio de aplicación cuando el contexto se utiliza por primera vez. Yo estoy buscando para inicializar la base de datos si no existe cada vez que intente acceder a él, incluso si ese contexto ha sido utilizado para acceder a la base de datos antes de.
    • Así que usted quiere recrear DB en el caso de no existir en cada consulta que hacer?
    • Sí. (stackoverflow requiere este texto adicional o yo no puedo publicar el comentario)
    • Comprobar la actualización de la respuesta.
    • Eso es bastante bueno y es 99% no, pero aún así sólo se aplican en el inicio de la aplicación. Mientras que es generalmente lo suficientemente bueno, sería bueno tener una solución en la que se carga una página que tiene acceso a la base de datos, eliminar la base de datos, a continuación, volver a cargar la página y la base de datos se vuelve a crear. Como es, tengo que hacer algún cambio en el código de la aplicación para activar el inicio de la aplicación antes de esta tarde (que admito es todavía mucho mejor que antes).
    • Actualmente estoy no en mi ordenador, así que me da una hora o así para proveer de usted con esa solución.
    • ¿Alguna vez ha de venir con esa solución? 🙂
    • Lo siento, no he podido responder antes. Por favor, revise la actualización de la respuesta y marcar como aceptado si es apropiado.

Dejar respuesta

Please enter your comment!
Please enter your name here