¿Cómo funciona la inicialización de datos?

Tengo un problema con la inicialización de datos en SQL Server Compact .sdf archivo de datos en la aplicación web .NET.

Tengo una clase de inicialización de datos.

namespace R10491.Models
{
    public class SampleData : DropCreateDatabaseAlways<LibraryEntities>
    {
        protected override void Seed(LibraryEntities context)
        {
            var categories = new List<Category>
            {
                new Category{Id=1, Name="Sci-fi"}
            };

        }
    }
}

(para fines de prueba utilizo DropCreateDatabaseAlways en lugar de DropCreateDatabaseIfModelChanges)

Esta clase de inicializador que llamo en el Global.asax.cs archivo:

protected void Session_Start()
{
   System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData());
}

(Nuevamente, con fines de prueba, lo llamo cada vez que se inicia una sesión).

Mi definición de cadena de conexión:

  <connectionStrings>
    <add name="LibraryEntities"
     connectionString="Data Source=C:\Users\Administrator\Documents\Visual Studio 2012\Projects\2OBOP3_KU1\R10491\App_Data\R10491_library.sdf;"
     providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>

Pero la inicialización no funciona: tablas definidas en SampleData no se crean clases ni se inicializan datos.

preguntado el 31 de diciembre de 12 a las 16:12

1 Respuestas

Parece que te estás olvidando de agregar el recién creado Category a la tabla de la base de datos. Si no lo agregas a la context'estable, Entity Framework no verá nada... Así que debe hacer algo como esto:

protected override void Seed(LibraryEntities context)
{
    var categories = new List<Category>
    {
        new Category{Id=1, Name="Sci-fi"}
    };

    foreach(Category c in categories)
    {
        context.Categories.Add(c)
    }

    // Call the Save method in the Context
    context.SaveChanges();  
}

Para el problema de DataSource, pruebe esta cadena de conexión modificada:

<add name="LibraryEntities"
     connectionString="DataSource=|DataDirectory|R10491_library.sdf"
     providerName="System.Data.SqlServerCe.4.0" />

En uno de mis proyectos tengo esta cadena de conexión:

<add name="FitnessCenterContext"
     connectionString="DataSource=|DataDirectory|FitnessCenter.Model.FitnessCenterContext.sdf"
     providerName="System.Data.SqlServerCe.4.0" />

Tenga en cuenta que el nombre de la base de datos coincide con el espacio de nombres y el nombre del contexto.


Yo también uso Application_Start() llamar al SetInitializer método en Global.asax.cs expediente. Veo que lo estás llamando por dentro Session_Start(). Tal vez este sea el problema... Cambia tu código a:

protected void Application_Start()
{
     System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData());
}

También puede intentar llamar al Initialize método:

protected void Application_Start()
{
     System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData());

     using (var context = new LibraryEntities())
     {
         context.Database.Initialize(true);
     }
}

Respondido el 01 de enero de 13 a las 02:01

Sí, me lo perdí, gracias. Pero hay otro problema. Cuando elimino un archivo .sdf y ejecuto mi aplicación, el archivo de datos .sdf no se crea y debería hacerlo, ¿no es así? Está conectado a mi pregunta original sobre cómo funciona este proceso de inicialización. - Artegón

Sí... debe crearse automáticamente después de reiniciar la aplicación y detecta el .sdf ya no existe Generalmente este archivo se crea dentro de la \App_Data carpeta. - Leniel Maccaferri

Pero en mi caso el .sdf el archivo no se crea. ¿Hay alguna necesidad de cometer cambios o algo parecido? ¿Dónde debería estar el problema? Gracias por cualquier consejo, busqué en Google durante una hora y no tengo idea de dónde está el problema. Tal vez sea un problema con mi ConnectionString: definí la ubicación del archivo como ruta completa (muchos tutoriales usan otra sintaxis). - Artegón

Mencioné la cadena de conexión en mi pregunta anterior. - Artegón

Mi clase de contexto FitnessCenterContext está dentro del espacio de nombres FitnessCenter.Model. Es una biblioteca de clases separada que uso. Si no está familiarizado con el espacio de nombres, verifique esto: msdn.microsoft.com/en-us/library/0d941h9d.aspx. ¿Puede decirme qué está usando: SQL Server Express, LocalDB, etc. para almacenar los datos? ¿Intentaste colocar el código dentro? Application_Start() en lugar de Session_Start()? - Leniel Maccaferri

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.