¿Cómo funciona la inicialización de datos?
Frecuentes
Visto 1,960 veces
2
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.
1 Respuestas
2
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas asp.net-mvc entity-framework initialization sql-server-ce seeding or haz tu propia pregunta.
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 MaccaferriPero 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ónMencioné la cadena de conexión en mi pregunta anterior. - Artegón
Mi clase de contexto
FitnessCenterContext
está dentro del espacio de nombresFitnessCenter.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 deSession_Start()
? - Leniel Maccaferri