entity framework - una - Cadena de conexión de entidad ADO.NET para múltiples proyectos
que es una cadena de conexion (8)
Estoy usando un proyecto de varias capas en el que DataModel aloja el modelo de entidad ADo.NET y la capa DataAccess hace la validación.
Sin embargo cada vez me sale un error como este
La conexión nombrada especificada no se encuentra en la configuración, no está diseñada para ser utilizada con el proveedor EntityClient o no es válida.
He intentado 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="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
y
<add name="SalesEntities" connectionString="metadata=./SalesEntities.csdl|./SalesEntities.ssdl|./SalesEntities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
También probé otras combinaciones para referir al directorio raíz del directorio del proyecto llamado, pero no hubo suerte.
Cualquier ayuda es muy apreciada. Muchas gracias como siempre :).
Añado el mismo problema, tratando de hacer una prueba de unidad de mi DAL. He encontrado que esto funciona:
<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
Debe colocar esas cadenas de conexión en cada archivo app.config de las aplicaciones. Si tiene un DAL en el que generó el modelo y luego intenta 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 desde el DAL en el que se generaron los modelos originalmente. Luego cada uno tendrá una copia de esa misma cadena de conexión.
Pasé el entityconnectionstring a todas las instancias de las clases de objectContext y está funcionando ahora.
Pero es una sobrecarga excesiva, crear una propiedad con cadena de conexión y pasarla como parámetro a cada instancia
Si copia su archivo App.Config
en el proyecto principal y reemplaza todos los "
con el caracter normal debería correr
Sugiero una ligera variación en las sugerencias dadas anteriormente.
No es una gran mejora, pero al menos le da cierta separación de preocupaciones.
Cuando el asistente de EF crea el archivo .edmx y su archivo .Designer .cs
asociado, el código C # declara una clase parcial. Así que 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.
Copia y pega la cadena de conexión desde el archivo .config del proyecto EDM, que es una especie de pirateo, pero al menos mantiene la cadena de conexión oculta en el proyecto EDM.
El nuevo archivo se ve así:
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 de entidades, simplemente llame a la función estática New_MyEntities () desde su proyecto de llamada.
Tengo el mismo problema y probé todos los métodos mencionados. Finalmente lo resolví como se mencionó. En mi caso tengo capa de datos separada y capa de presentación. 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="data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
en mi web.config
configuré manualmente la conexión 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 la misma excepción como se mencionó anteriormente. así que lo resolví agregando valor app.config en el archivo de configuración web.
mi archivo web.config
final 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="data source=TILANITHOTAMUNE/SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True"" 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>
Tuve el problema en uno de mis proyectos, ya que un trabajo, una aplicación web y un proyecto de prueba requerían una cadena de conexión del marco de la entidad. Una forma de lidiar con esto fue la siguiente:
1) Utilice el patrón UnitOfWork (o similar). Esto permite controlar la creación de contexto de datos y manipular la 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);
}
}
}
El contexto de datos debe permitir la entrada directa de la cadena de conexión:
myContext público (String connectionString): base (connectionString) {}
Tuve un problema similar con un proyecto de WinForms y, a pesar de haber intentado todo lo que pude encontrar relacionado con él en la web, no pude resolver mi problema ... hasta que eliminé el campo que estaba usando para mi ObjectContext (CubEntities privadas _oc = new CubEntities ()) desde mi BaseForm a la forma real que lo usa.