c# - method - EF4 Poco Asignar tipos de mapeo Mismo nombre Mismo ensamblaje Diferentes espacios de nombres
select entity framework c# (4)
Estoy experimentando un problema con EF4 y Proxy Pocos .
Tengo 2 clases con el mismo nombre en el mismo ensamblaje pero con diferentes espacios de nombres :
QuoteModels.CashPayment
OrderModels.CashPayment
Esto compila bien pero en tiempo de ejecución, EF lanza la siguiente excepción:
El esquema especificado no es válido. Errores: / r / nEl mapeo del tipo CLR al tipo EDM es ambiguo porque varios tipos CLR coinciden con el tipo EDM ''CashPayment''. Tipo CLR encontrado anteriormente ''QuoteModels.CashPayment'', tipo CLR encontrado recientemente ''OrderModels.CashPayment''
¿Existe una solución para tener clases con el mismo nombre en el mismo ensamblaje con diferentes espacios de nombres para trabajar con Ef4?
¿Tengo que darles nombres diferentes o moverlos a otra asamblea?
Acabo de encontrar un problema similar. Me tomó un tiempo para identificar el patrón, pero en mi contexto surgieron problemas cuando tenía dos modelos que tenían dos de las mismas entidades.
En uno de mis modelos tenía las siguientes entidades ("->" denota la relación con la dirección): Users -> Authentication -> Authorization
(un usuario se autentica y luego se autoriza).
En el otro tenía estas entidades: Authentication -> Authorization -> InvoiceGeneration
(un usuario autenticado y autorizado genera una factura).
Al ejecutar mi aplicación con estos dos modelos, recibí el mismo error que el póster original.
Resultó que mi problema desapareció cuando eliminé la entidad de Authentication
del segundo modelo, por lo que parece que el mapeador de EDM a CLR no puede hacer frente a las entidades que tienen el mismo tipo de relaciones "primarias" (en mis dos modelos, la Authorization
fue "precedida "por Authentication
. Lo siento por las descripciones de relaciones no científicas :)
Echa un vistazo a este post . El comentario de Derek parece tratar el mismo problema, y no recibió ninguna respuesta de Microsoft.
He encontrado una solución alternativa. Es una solución muy obvia que no es ideal, pero creo que lo llamaré lo suficientemente bueno para nosotros hasta que EF5 salga a arreglar esto.
Respuesta corta: simplemente cambie el nombre de una o las dos entidades ambiguas. Me gusta: 2x Person
se renombra a: Personal_Person
y Work_Person
función de PersonalContext
y WorkContext
.
Respuesta larga: en nuestro escenario, estamos usando un enfoque de base de datos primero (estamos reescribiendo una aplicación heredada con cambios mínimos en la base de datos). Nuestra base de datos contiene cientos de tablas, así que en lugar de usar un solo EDMX / Contexto, estoy usando múltiples EDMX / Contextos (el EDMX se ha distorsionado cada vez que he intentado agregar más de la mitad de nuestras tablas). Sin embargo, algunas tablas deben existir en más de un EDMX / Context.
Para discusión, supongamos que tenemos una base de datos simple con las siguientes tablas:
-
Person
-
Family
-
Relationship
-
Address
-
Business
-
Employee
Además, por el bien de esta discusión, supongamos que CUALQUIER tabla que existe en múltiples contextos causa este problema (como dije en los comentarios a la respuesta de Devart, esto no es realmente cierto y no entiendo por qué a veces funciona).
Ahora digamos que queremos crear dos contextos:
PersonalContext
:
-
Person
-
Family
-
Relationship
-
Address
WorkContext
:
-
Person
-
Business
-
Address
-
Employee
En este escenario, tanto la Person
como la Address
causarán nuestro problema. Entonces, lo que haremos en nuestra asignación EDMX es simplemente cambiar el nombre de nuestras entidades a Personal_Person
/ Work_Person
y Personal_Address
/ Work_Address
.
Como se dijo, esta es una solución muy obvia que no es ideal, pero como EF no toma en cuenta el espacio de nombres y va estrictamente por su nombre (no es la verdadera identidad, simplemente el nombre), una opción es poner su espacio de nombres dentro de tu nombre.
Ahora todavía estoy debatiendo si lo voy a hacer de esa manera o tal vez incluya el nombre de cada entidad ( Personal_Person
, Personal_Family
, Personal_Relationship
, Personal_Address
y Work_Person
, Work_Business
, Work_Address
, y Work_Employee
) por coherencia y por su Work_Employee
. mantener todas las entidades en el orden alfabético adecuado, ya que realmente, el espacio de nombres pertenece antes que el nombre en lugar de después, pero eso es una decisión de juicio y no es realmente importante proporcionar una solución al problema.
¡¡Espero que esto ayude!!
Lo que hice fue eliminar una de las entidades repetidas y para la otra entidad crear una clase parcial que tenga las propiedades de la entidad eliminada
Ejemplo:
namespace Namespace1
{
class Talk
{
public int TalkId {get; set;}
}
}
namespace Namespace2
{
class Talk
{
public int TalkId {get; set;}
public string SomeExtraInfo {get; set;}
}
}
Resultado:
namespace Namespace1
{
class Talk
{
public int TalkId {get; set;}
}
}
namespace Namespace1
{
partial class Talk
{
public string SomeExtraInfo {get; set;}
}
}
Espero que ayude a alguien