Tengo un objeto de marco de una entidad y cuando lo agrego a mi proyecto, connectionstring
se agrega app.config
en la connectionstring
sección, pero cuando quiero crear uno nuevo entitycontext
y usarlo connectionstring
, aparece este error
Tengo un objeto de marco de una entidad y cuando lo agrego a mi proyecto, connectionstring
se agrega app.config
en la connectionstring
sección, pero cuando quiero crear uno nuevo entitycontext
y usarlo connectionstring
, aparece este error
Respuestas:
Sospecho que su problema proviene del hecho de que tiene más de un proyecto en su solución y el que contiene los elementos del marco de su entidad, incluidos los edmx
archivos, NO es el proyecto de inicio de las soluciones. En este caso, incluso si la cadena de conexión existe en el app.config
proyecto EF , CLR aún no puede encontrarla en tiempo de ejecución. Por ejemplo, si tiene un sitio web y un proyecto de EF en su solución, debe copiar la cadena de conexión de los proyectos de EF app.config
a los de su sitio web web.config
. Básicamente, cualquier dato de cadena de conexión debe existir en el archivo de configuración del proyecto desde el cual los hilos .Net iniciados por CLR (es decir, su proyecto de inicio). Si este no es su caso, simplemente abra suedmx
archivo, haga clic derecho en su superficie, seleccione propiedades y copie la cadena de conexión y péguela en la app.config
sección Cadena de conexión. De esta manera, puede asegurarse de tener la correcta en su configuración.
EDITAR:
Como puede ver aquí en
Documenation en ObjectContext Constructor , el primer parámetro es el nombre de la cadena de conexión, que es el código generado en el momento en que crea su EDM. Si, de alguna manera, se cambia el nombre de la cadena de conexiones, todo lo que necesita hacer es hacer clic derecho en su modelo y seleccionar "Actualizar modelo de la base de datos ...", luego siga el asistente para actualizar su confing y diseñador para reflejar esto cambio.
Debe copiar la cadena de conexión en app.config a su web.config, o copiar todo el archivo al proyecto que muestra el resultado. Es una de las condiciones para consumir el marco.
Me encontré con este problema cuando intenté poner mi lógica de base de datos personalizada en un .dll para ser utilizada por múltiples proyectos en mi solución.
Si bien el archivo .dll tenía el archivo app.config correcto, no funcionó. Entity frameworks quería la información de conexión en la aplicación.config del .exe. Copiar la información allí funcionó bien.
La solución de Morteza de pegar la cadena de conexión directamente en el .edmx no funcionó para mí, ya que no me permitía pegar el valor allí, aunque eso es precisamente lo que quería poder hacer.
Hola, tuve este problema y me estaba volviendo loco. De todos modos, finalmente descubrí cuál era el problema. Lo primero que tiene que hacer es asegurarse de que el connectionstrings
en app.config
y web.config
son los mismos. Luego debe hacer doble clic en el .edmx
archivo para poder ver las tablas. Una vez que haga clic en cualquier lugar cerca de las tablas, pero no en las tablas, vaya a las propiedades. En la lista desplegable, seleccione ConceptualEntityModel
y busque el Nombre del contenedor de la entidad y recuérdelo bien.
A continuación, vaya al diseñador del archivo edmx y abra los constructores. (el diseñador es la subcarpeta del archivo edmx) los constructores deben tener dos parámetros en el parámetro BASE
public DBEntities() : base("name=DBEntities", "DBEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
Este es uno de ellos. el primer parámetro debe tener el nombre del archivo del proyecto en el que se encuentra el .edmx
archivo. El segundo parámetro debe tener el nombre del contenedor de la entidad de las propiedades que mencioné anteriormente. no olvide organizar todos los constructores con:base("", "")
Al menos ese era mi problema y mi problema se resolvió así. Espero que puedas resolver el tuyo así.
Tenía una variación sobre esto que nadie parecía cubrir.
Tenía un proyecto principal con un par de modelos y un Proyecto de prueba que contenía pruebas unitarias. El Proyecto de prueba estaba funcionando, pero luego se detuvo con el error mencionado en el OP. No había hecho ningún cambio de nombre o movimiento del archivo EDMX.
Muchos de los consejos mencionaron la comparación de archivos .config, pero mi proyecto no tenía ninguno.
Al final, copié el archivo app.config del proyecto principal en mi proyecto de prueba y luego funcionó. Si este es el paso correcto o si presentará problemas de mantenimiento cuando se agreguen modelos adicionales, no lo sé, pero al menos mis pruebas unitarias se están ejecutando correctamente nuevamente ahora.
Aunque la respuesta de Morteza Manavi resuelve este problema, otra solución es construir la cadena de conexión dinámicamente y pasarla al constructor para su ObjectContext:
public static string CreateConnectionString()
{
var assemblyPath = Assembly.GetExecutingAssembly().Location;
string assemblyLocation = Path.GetDirectoryName(assemblyPath);
string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };
var entityBuilder = new EntityConnectionStringBuilder
{
ProviderConnectionString = sqlBuilder.ConnectionString,
Provider = "System.Data.SqlServerCe.3.5",
Metadata = @"res://*/YourModel.csdl|
res://*/YourModel.ssdl|
res://*/YourModel.msl"
};
return entityBuilder.ToString();
}
// Snip...
var entityContext = new YourObjectContext(CreateConnectionString());
Esto elimina la necesidad de copiar la información de la cadena de conexión a la configuración de la aplicación de su proyecto de inicio que, al menos en mi caso, no era deseable.
Olvidé agregar providerName = "System.Data.EntityClient" como atributo en la cadena de conexión. Esto dio lugar a este error, así
<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />
en vez de
<add name="connectionName" connectionString="metadata=res://*/..." />
Acabo de descubrir que si se crea una aplicación en IIS desde VS2010 a dos niveles desde la raíz del sitio web, se produciría este error. No estoy seguro de por qué sucede, necesitaría investigar más. Por ejemplo, si su aplicación está en esta ruta: /admin/advertiser
el error aparecerá si no tiene /admin
un directorio virtual en su sitio IIS.
Todo lo que hice fue crear un admin
directorio vacío en mi .../intepub/wwwroot
error desapareció.
Descubrirá que no podrá comenzar a depurar hasta que realice el paso anterior.
Tuvimos este problema en nuestro equipo en el pasado, nos tomó un tiempo recordarlo, pero así fue exactamente como lo solucionamos antes.
Estoy usando n'tier architecture y tengo el mismo problema, pero este me ayuda. Espero que esto te ayude. Primero tiene lo mismo connection string
sobre usted libraries
donde puede acceder a DB como en app.config
y web.config
después de eso simplemente agrega un constructor sobrecargado en el archivo .edmx (Model.context.cs) que ahora tiene dos constructores, uno es predeterminado y el otro que acaba de agregar ( sobrecargado).
public YourEntityName(string connString)
: base(connString)
{
}
Tenía una biblioteca de clase que tampoco quería trabajar con EF. Después de copiar el archivo app.config (o solo la sección de conexiones) de mi biblioteca de clases al proyecto exe, ¡la conexión funcionó bien! Probablemente se espera que el archivo de configuración esté en la misma carpeta que el proyecto exe y, por lo tanto, no se encontró. ¡Así que siempre tenga mucho cuidado cuando use un archivo de configuración en un proyecto de biblioteca de clases!
Bueno ... este problema podría ser también por una razón muy simple (tonta) ... Copié un archivo de otro proyecto y olvidé cambiar la ConnectionString en EntityDataSource ... ya que estaba al comienzo del proyecto y sucedió en la página de inicio de sesión, pensé que era algo en la configuración, pero era solo el nombre de cadena de conexión incorrecto (y DefaultContainerName).