2010-11-01 26 views
16

Mi aplicación utiliza dos bases de datos SQL 2008 diferentes. Las bases de datos tienen algunas tablas con el mismo nombre, es decir. Users. Me gustaría usar EF4 para ambas bases de datos. Sin embargo, cuando ejecuto mi aplicación y golpea la creación ObjectContext de la segunda base de datos, me sale el siguiente error:¿No puede tener los mismos nombres de tabla en diferentes modelos de marcos de entidades?

Multiple types with the name 'User' exist in the EdmItemCollection in different namespaces. Convention based mapping requires unique names without regard to namespace in the EdmItemCollectionto namespace in the EdmItemCollection

¿Quiere decir esto que no puedo usar dos bases de datos con (parcialmente) los mismos nombres de tabla en la misma aplicación? Están en diferentes espacios de nombres, diferentes modelos de edmx, diferentes proyectos, etc.

P.S. Uno de los modelos es generado por un diseñador y utiliza clases de POCO y el otro se deduce de la base de datos y está estrechamente vinculado a EF.

+0

¿Cambiaría el nombre de la entidad de uno de ellos en el Diseñador al resolver esto? Sin embargo, eso parece un poco incómodo. –

+0

Estoy esperando una solución diferente. Esta es una aplicación de conversión de base de datos (desde una base de datos heredada a la nueva) por lo que hay bastantes nombres de tabla iguales. Además de terminar con los nombres de tipos incorrectos, renombrarlos en el diseñador significaría una refactorización seria en la nueva aplicación. – Carvellis

+0

Tengo el mismo problema con nombre de entidad diferente ... – juanora

Respuesta

10

El error significa, lo que dice: No se puede usar el mapeo basado en convenciones predeterminado en su escenario. Utilice asignación de base de datos personalizada en su lugar. Scott Guthrie tiene un artículo de blog detallado sobre this.

22

Para utilizar el "mapeo basado convención por defecto" los siguientes 2 enfoques funcionarán:

1) La colisión es causada por la cadena de conexión usando un comodín:

metadata=res://*/Repositories.EntityFramework.Model.csdl|res://*/Repositories.EntityFramework.Model.ssdl|res://*/Repositories.EntityFramework.Model.msl; 

Desde * hace no funciona su proyecto, puede definir múltiples cadenas de conexión para codificar el ensamblaje que contiene el edmx.

2) crear un ayudante

public static EntityConnection GetEfConnectionString(this string sqlConnectionString) 
    { 
     var cs = string.Format(@"metadata=res://{0}/Repositories.EntityFramework.Model.csdl|res://{0}/Repositories.EntityFramework.Model.ssdl|res://{0}/Repositories.EntityFramework.Model.msl;provider=System.Data.SqlClient;provider connection string=""" + sqlConnectionString + @"""", 
      Assembly.GetCallingAssembly().FullName 
     ); 

     return new EntityConnection(cs); 
    } 

Actualización 2017:

public static string GetEfConnectionString(this string sqlConnectionString, Type type) 
    { 
     string cs = 
      string.Format(
       @"metadata=res://{0}/Models.Model.csdl|res://{0}/Models.Model.ssdl|res://{0}/Models.Model.msl;provider=System.Data.SqlClient;provider connection string=""" + 
       sqlConnectionString + @"""", 
       type.Assembly.FullName 
       ); 
     return cs; 
    } 


    // usage: don't "new" EntityConnection. See 2012 comment. 
    string connString = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString.GetEfConnectionString(); 
    using(var entities = new XyzEntities(connString)) 
+0

Esto me ayudó bastante. Modifiqué mis plantillas T4 para implementar algo así, de modo que todos los modelos puedan usar una cadena de conexión desde config pero aún así puedan leer solo sus metadatos. Gracias. –

+0

Acabo de subir de categoría y quería actualizar esto ... No hagas una nueva EntityConnection, ya que de lo contrario necesitarás administrar la apertura/cierre del objeto. En su lugar, su ayudante debería devolver la cadena de conexión como una cadena y usar el constructor de sobrecarga en el objetocontexto ef4.0 o dbcontext ef4.1. –

+1

+1 para la solución más simple que funciona sin Code First también. – christoph

1

que tenían el mismo problema, pero mi solución era eliminar el DLL del modelo \ edmx del proyecto, porque fue copiado de un proyecto diferente, y luego reconstruirlo. ¡Resolvió todo!

Cuestiones relacionadas