2010-10-07 20 views
11

Creé una clase de contexto db y agregué una cadena de conexión en mi archivo web.config como se indica en Code First Development with Entity Framework 4 de Scott Guthrie. Lo estoy ejecutando desde un método de prueba. Recibí varios errores de base de datos al ejecutar las pruebas, pero cuando finalmente limpié las clases para que la prueba tuviera éxito, todavía no tenía ninguna base de datos en la carpeta App_data.Entity Framework Code First no genera base de datos

He añadido Database.CreateIfNotExists() al constructor dbContext, pero aún no hay un archivo sdf. ¿Alguien sabe lo que estoy haciendo mal?

Respuesta

23

Para que la base de datos se cree automáticamente, el nombre de la cadena de conexión debe nombrarse exactamente como el nombre de la subclase DbContext (con espacio de nombres).

Por ejemplo. Digamos que su clase DB es así:

namespace MyNamespace 
{ 
    public class FooDb : DbContext 
    {  
     public DbSet<XXX> ABC{ get; set; } 
    } 
} 

Su cadena de conexión debe verse así:

<connectionStrings> 
    <add name="MyNamespace.FooDb" connectionString="Data Source=|DataDirectory|MyNamespace.FooDb.sdf" providerName="System.Data.SqlServerCe.4.0"/> 
    </connectionStrings> 
+0

Espacio de nombres o no, la materia does't para mí. – Alex

3

Compruebe SQL Server Management Studio -> \ sqlexpress

Ahí es donde CF ha estado poniendo. todas mis bases de datos cuando no especifico una cadena de conexión.

+0

Es cierto que sin cadena de conexión, la base de datos se crea en el directorio de trabajo del servidor web. – Jonx

2

ver aquí para la creación automática de la .sdf con EF 4.1 y el paquete de SQL CE NuGet (o un nuevo proyecto MVC 3 aparentemente):

http://www.goatly.net/2011/6/27/entity-framework-code-first-the-path-is-not-valid-check-the-directory-for-the-database.aspx

Para resumir: Crear un vacío Carpeta App_Data: el sdf se crea automáticamente, pero solo si está presente la carpeta en la que entra.

+0

-1 sin explicación dañan a la comunidad, especialmente si invalidan una respuesta razonable. Esto funcionó para mí, y tardó mucho tiempo en descubrirlo. Volví a una publicación que no me proporcionó la respuesta y proporcioné lo que encontré. Entonces, ¿por qué el menos? –

0

Asegúrese de que su dbcontext utilizando cadena de conexión correcta Algo similar como esto

public class DBContext : IdentityDbContext<ApplicationUser> 
    { 
     public DBContext() 
      : base("DefaultConnection", throwIfV1Schema: false) 
     { 
     } 
} 

Y en web.config

<add name="DefaultConnection" connectionString="Server=....;Connection Timeout=300;" providerName="System.Data.SqlClient" /> 
Cuestiones relacionadas