10

Estoy usando EF 4.1 y creo un archivo EF edmx normal. Lo genero desde un DB.Entity Framework no puede usar DbContext, modelo creado

Cuando se ha generado, hago clic con el botón derecho y selecciono agregar elemento de generación de código para generar nuevas clases y, en su lugar, uso el DbContext. Yo uso la plantilla generador de DbContext.

Todo funciona bien.

Entonces me trie para consultar el contexto:

using (var context = new PasDBEntities()) 
{ 
    var client=context.ClientCompanies.SingleOrDefault(_=>_.ID==clientCompanyId); 
    if(client!=null) 

tengo ningún problema al crear una nueva instancia del contexto, pero cuando trato de consultar el problema que se produzca. Me quedo atrapado en UnintentionalCodeFirstException. y obtiene el error:

{"Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception."}

no quiero usar el código en primer lugar, pero no sé si puedo "cambiar" si fuera poco, o dónde está el problema.

Para referencia, aquí es mi constructor ...

public partial class PasDBEntities : DbContext 
{ 
    public PasDBEntities() 
     : base("PasDBEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

... y cadena de conexión:

<connectionStrings> 
    <add name="PasDBEntities" 
     connectionString="metadata=res://*/PasDB.csdl| 
            res://*/PasDB.ssdl| 
            res://*/PasDB.msl; 
          provider=System.Data.SqlClient; 
          provider connection string=&quot; 
          data source=localhost; 
          initial catalog=PasDB; 
          integrated security=True; 
          pooling=False; 
          multipleactiveresultsets=True; 
          App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" /> 
</connectionStrings> 
+6

¿Es esta cadena de conexión en el "archivo de configuración de la ejecución de la aplicación ** **" (para citar la excepción) y no sólo en un archivo de configuración de un proyecto de biblioteca? – Slauma

+1

Tienes razón. No sabía que tenía que agregar un archivo de configuración adicional para la conexión de mi proyecto de prueba unitaria para poder usar el EF. Eso resolvió mi problema y agregó otro archivo app.config. – Fore

Respuesta

7

veo que está utilizando el EDMX con plantillas (.tt) para generar las clases. Pero si obtiene la información de una base de datos existente, el asistente creará una ConnectionString compatible con ObjectContext (información de metadatos y proveedor de entidad de marco).

El problema es que la conexión que está utilizando es para ObjectContext (Base de datos primero y Modelo primero). Para el DbContext, debe usar la conexión sin las informaciones de metadatos.

Su cadena de conexión debe ser:

<connectionStrings> 
<add name="PasDBEntities" 
    connectionString="data source=localhost; 
         initial catalog=PasDB; 
         integrated security=True; 
         pooling=False; 
         multipleactiveresultsets=True; 
         App=EntityFramework" 
    providerName="System.Data.SqlClient" /> 

+1

realmente en EF5 debería poder usar la conexión de edmx y entidad con DbContext. En VS2012 T4 se cambiaron para generar DbContext para DatabaseFirst. – Pawel

+1

En realidad, yo estaba tratando de pasar del código primero a la base de datos. Su respuesta indicó que necesitamos usar la cadena especial llena de metadatos, gracias por eso. Básicamente, lo que esto significa es cuando se utiliza el asistente de ADO.NET, el "Guardar cadena de conexión" NECESITA para ser utilizado. – Worthy7

Cuestiones relacionadas