c# - mvc - El mapeo del tipo CLR al tipo EDM es ambiguo con EF 6 y 5?
entity framework tutorial español c# pdf (10)
Por favor, alguien me puede ayudar a solucionar este error?
El esquema especificado no es válido. Errores:
La asignación del tipo de CLR al tipo de EDM es ambigua porque varios tipos de CLR coinciden con el tipo de EDM ''City_DAL''. CLR encontrado anteriormente tipo ''CeossDAL.City_DAL'', CLR recién encontrado tipo ''CeossBLL.City_DAL''.
El principal problema que tengo DAL y esto contiene el EF y BLL y esto contiene las mismas clases de DAL, pero difieren en el espacio de nombres y esto es lo que causa el problema
No sé cómo deshacerme de estos problemas, ¿pueden ayudarme?
También seré apreciado si alguien me da muestra para usar la arquitectura n-tier con EF
Gracias
En algunos casos, esto es más un síntoma que el problema real. Para mí, generalmente aparece cuando trato de llamar a una función dentro de una consulta Linq sin llamar a .ToList () primero.
Por ejemplo, el error que me trajo aquí fue causado porque hice esto:
var vehicles = DB.Vehicles.Select(x => new QuickSearchResult()
{
BodyText = x.Make + " " + x.Model + "<br/>"
+ "VIN: " + x.VIN + "<br/>"
+ "Reg: " + x.RegistrationNumber +"<br/>"
+ x.AdditionalInfo
type = QuickSearchResultType.Vehicle,//HERE. Can''t use an enum in an IQueryable.
UniqueId = x.VehicleID
});
Tuve que llamar a .ToList (), luego recorrer cada elemento y asignarle el tipo.
Esto puede no haber estado disponible cuando se formuló la pregunta, pero otra solución es eliminar el EDMX y volver a crearlo como un modelo de datos de entidad de primer código. En EF6, con código primero, puede asignar dos clases con el mismo nombre de espacios de nombres de modelos diferentes sin crear un conflicto.
Para crear el modelo de datos de la entidad en Visual Studio (2013), vaya a "Agregar"> "Nuevo elemento ..."> "Modelo de datos de la entidad ADO.NET". Asegúrese de elegir la opción "Codificar primero desde la base de datos".
Hay una biblioteca llamada AutoMapper que puedes descargar. Le ayuda a definir asignaciones de clase de un tipo a otro.
Mapper.CreateMap<Model.FileHistoryEFModel, DataTypes.FileHistory>();
Mapper.CreateMap<DataTypes.FileHistory, Model.FileHistoryEFModel>();
No utilice clases con el mismo nombre no calificado : EF utiliza solo nombres de clase para identificar el tipo mapeado en EDMX (se ignoran los espacios de nombres). Es una convención permitir que las clases de mapeo de diferentes espacios de nombres a un solo modelo. La solución para su problema es nombrar sus clases en BLL de manera diferente.
Otra razón por la que puede obtener este error: si está cargando ensamblajes personalizados con Assembly.LoadFile que tienen archivos edmx, que ya se han cargado en la memoria. Esto crea clases duplicadas que el marco de entidad no le gusta.
Para EF 6.x, encontré algunas notas en https://github.com/aspnet/EntityFramework/issues/941 y solucioné esto en mi solución al agregar una anotación al tipo de EDM.
Edité el archivo EDMX manualmente y cambié una línea como esta:
<EntityType Name="CartItem">
a esto:
<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem">
o usa esto si tienes un tipo existente en otro lugar:
<EntityType Name="CartItem" customannotation:ClrType="MyApp.CartItem, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
donde EntityModel es el espacio de nombres utilizado para mi modelo EF, y MyApp es el espacio de nombres de un objeto comercial
Para mí, esto fue porque estaba intentando acceder a un tipo con el mismo nombre en la instancia de contexto incorrecta.
Digamos que tanto ContextA
como ContextB
tienen ContextB
. Estaba intentando acceder a ContextA.SomeType
en una instancia de ContextB
.
Recibí el error anterior porque para ambas cadenas de conexión, tenía el mismo valor para los metadatos especificados en el archivo de configuración de mi proyecto principal, como a continuación:
<add name="EntitiesA" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string="data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="EntitiesB" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string="data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Terminé copiando la cadena de conexión correcta del archivo de configuración del proyecto de EntitiesB.
This pregunta del foro de MSDN podría ser útil. Sugiere colocar las clases BLL y DAL en ensamblajes separados.
Solución alternativa: cambie una propiedad en una de las dos clases idénticas.
EF coincide con el nombre de clase Y las propiedades de clase. Así que acabo de cambiar el nombre de una propiedad en uno de los objetos EF, y el error desapareció.
Como @Entrodus comentó sobre una de las otras respuestas:
La colisión EF ocurre solo cuando dos clases tienen el mismo nombre Y el mismo conjunto de parámetros.