27

Estoy utilizando un proyecto de múltiples capas donde DataModel aloja el modelo de entidad ADo.NET y la capa DataAccess realiza la validación.Cadena de conexión de entidad ADO.NET para múltiples proyectos

Sin embargo cada vez que sale un error como éste

La conexión con nombre especificado no se encontró en la configuración, no destinado a ser utilizado con el proveedor EntityClient, o no válida.

he tratado cadenas de conexión

<add name="SalesEntities" connectionString="metadata=res://*/SalesEntities.csdl|res://*/SalesEntities.ssdl|res://*/SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

y

<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

también trataron otras combinaciones para hacer referencia al directorio raíz del directorio del proyecto llamado, pero sin suerte.

Cualquier ayuda es muy apreciada. Muchas gracias como siempre :).

Respuesta

25

Debe poner esas cadenas de conexión en cada aplicación app.config file. Si tiene un DAL en el que generó el modelo y luego trata de consumir el DAL en un EXE, sucederá lo mismo. El EXE no conoce la cadena de conexión.

Lo más fácil que he encontrado es poner un app.config en cada proyecto y simplemente copiar la cadena de conexión del DAL que generé originalmente en los modelos. Entonces cada uno tendrá una copia de esa misma cadena de conexión.

+3

hm, es de algún modo posible almacenar todas las cadenas de conexión en un lugar y luego 'diga' a todos los archivos web.config dónde encontrar que las cadenas de conexión? – Tony

+0

Puede colocarlos en MACHINE.CONFIG (global en la máquina), pero esto requiere más privs y la implementación no es una buena idea en ese escenario. –

+1

Usando una clase parcial, puede crear su propio constructor para el contexto de datos generado para sus entidades y hacer que configuren la cadena de conexión como lo desee. También deberá llamar a ese constructor específico donde sea que crea una instancia del contexto de datos. – jcmcbeth

0

Agrego el mismo problema, tratando de probar mi DAL. He encontrado que esto funciona:

<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
0

He tenido un problema similar con un proyecto WinForms y a pesar de tratar todo lo que encontraba relacionado con él en la web no podría resolver mi problema ..... hasta que me quité el campo que estaba usando para mi ObjectContext (CubEntities privadas _oc = new CubEntities()) de mi BaseForm al formulario real que lo usa.

2

Si copia el archivo de App.Config en el proyecto principal y reemplazar todos los &quot; con el carácter normal ' debe ejecutar

1

pasé el entityconnectionstring a todas las instancias de las clases ObjectContext y su trabajo ahora.

Pero es un exceso de gastos generales, la creación de una propiedad con connectionstring y haciéndola pasar como un parámetro para cada instancia

2

que sugieren una ligera variación en las recomendaciones citadas más arriba.

No es una gran mejora, pero al menos te da una cierta separación de preocupaciones.

Cuando el asistente EF crea el archivo .edmx y su archivo .Designer .cs asociado, el código C# declara una clase parcial. Entonces, simplemente puede agregar otro archivo .cs al proyecto que contiene los dos archivos EDM.

Este nuevo archivo define una función estática adicional para el mismo espacio de nombres y clase.

Esta nueva función estática devolverá una instancia del tipo deseado (el descendiente de ObjectContext).

El nuevo archivo es un archivo separado, por lo que no se sobrescribirá si vuelve a crear .edmx y .Designer.cs.

Copie y pegue la cadena de conexión del .config del proyecto EDM, que es una especie de hack, pero al menos mantiene la cadena de conexión oculta en el proyecto EDM.

El nuevo archivo tiene el siguiente aspecto:

namespace MyNamespace 
{ 
    public partial class MyEntities : ObjectContext 
    { 
    public static MyEntities New_MyEntities() 
    { 
     string connStr; 
     MyEntities theContext; 

     connStr = "metadata=res://*/MyClass.csdl|res://*/MyClass.ssdl|res://*/MyClass.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=localhost\\SQLSERVER;Initial Catalog=MyDb;Integrated Security=True;MultipleActiveResultSets=True\""; 
     // set the connection string 

     theContext = new MyEntities(connStr); 
     // allocate it 

     return theContext; 
     // return it 
    } 
    } 
} 

Para obtener un nuevo objeto entidades, sólo tiene que llamar a la función New_MyEntities estáticos() de su proyecto llamado.

0

Tengo el mismo problema & probé todo el método mencionado. finalmente lo resolví como lo mencioné. En mi caso, tengo una capa de datos y una capa de presentación por separado. en mi app.config (capa de datos) tengo una conexión como esta.

<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

en mi i conexión configurada manualmente web.config de la siguiente manera:

<add name="DefaultConnection" providerName="System.Data.SqlClient" 
connectionString="Data Source=abc; 
Initial Catalog=LibraryMgtSys; 
Integrated Security=SSPI; 
user id=sa;password=123;" /> 

me da misma excepción como se mencionó anteriormente. así que lo resolví agregando el valor de app.config en el archivo de configuración web.

mi archivo final web.config de la siguiente manera:

<connectionStrings> 
    <clear /> 
    <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
    <add name="DefaultConnection" providerName="System.Data.SqlClient" 
     connectionString="Data Source=abc; 
     Initial Catalog=LibraryMgtSys; 
     Integrated Security=SSPI; 
     user id=sa;password=123;" /> 
    </connectionStrings> 
0

que tenía el tema en uno de mis proyectos, como cadena de conexión marco de la entidad fue requerido por un trabajo, una aplicación web y un proyecto de prueba. Una forma de lidiar con esto fue la siguiente:

1) Use el patrón UnitOfWork (o similar). Esto permite controlar la creación de contexto de datos y manipular cadena de conexión

public partial class MyContext 
{ 
    #region Members 
    private static readonly object objSync = new object(); 
    private static readonly string DATACONTEXT_KEY = "MyContext_UserInstance"; 
    // TODO: read from a place accesible to all deployed projects 
    // remove hardcoded database 
    private static readonly string DefaultConnectionString = @"metadata=res://*/MyContext.csdl|res://*/MyContext.ssdl|res://*/MyContext.msl;provider=System.Data.SqlClient;provider connection string='data source=Server;initial catalog=MyDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework'"; 

    private static string connectionString; 
    #endregion 

    public MyContext(String connectionString) : base(connectionString) 
    { 
    } 

    /// <summary> 
    /// Uses a UnitOfWorkStore to return the same instance of MyContext, that is unique 
    /// per user, per postback (or CallContext, if not in an HttpContext environment, such as unit tests or console apps) 
    /// </summary> 
    public static MyContext Instance 
    { 
     get 
     { 
      // Dirty (non thread-safe) check 
      if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
      { 
       lock (objSync) 
       { 
        // Thread-safe check 
        if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
        { 
         MyContext context = new MyContext(DefaultConnectionString); 
         connectionString = context.Database.Connection.ConnectionString; 
         UnitOfWorkStore.SetData(DATACONTEXT_KEY, context); 
        } 
       } 
      } 
      return (MyContext)UnitOfWorkStore.GetData(DATACONTEXT_KEY); 
     } 
    } 

} 
  1. contexto de datos debe permitir directa de entrada de cadena de conexión:

    MyContext

    pública (String connectionString): base (connectionString) {}

Cuestiones relacionadas