2011-08-10 21 views
5

Escenario: tratando de extraer y reacomodar información de una base de datos a otra. DB A tiene algunos datos que quiero obtener. Quiero almacenarlo en DB B en una estructura ligeramente diferente.Uso de ObjectContext y DbContext

DB A Obtengo el uso de un modelo generado por la base de datos EDMX por lo que utiliza una derivada de ObjectContext. DB B Me gustaría ser generado por código. Así que uso el primer enfoque de código/modelo instalando EntityFramework 4.1 a través del administrador de paquetes. Así DB B utiliza un derivado DbContext

Cuando intento para almacenar la información de base de datos de A a B es DB dice:

RoutIT.Irma.Import.Service.Test.ImportIrma2ProductTests.ImportProducts Método de ensayo arrojaron excepción: Sistema .ArgumentException: no se pudo encontrar el tipo de modelo conceptual para 'Some entity in DB A's EDMX model'

Lo hace al agregar una entidad DB B a la propiedad DbSet del DbContext Derivado de DB B. Así que el código es como

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
      foreach (FirstPVC pvc in pvcs) 
      { 
       this._irmaImport.FirstPVCs.Add(pvc); <-- 
       this._irmaImport.SaveChanges(); 
      } 
      scope.Complete(); 
     } 
} 

Sucede en el punto en el código marcado por la flecha de arriba ("< -")

FirstPVC es una propiedad DB B pero a la punta de la flecha se se queja de no tener un modelo conceptual para una entidad que pertenece al contexto de DB B.

Esto es extraño ya que intento almacenar una entidad DB B en el contexto DB B. ¿Por qué debería preocuparse por las entidades de DB A.

Todos los contextos están contenidos en el mismo proyecto. Pero el DbContext Derivado de DB B solo tiene conocimiento sobre sus propias propiedades DbSet <>, de repente cuando intento agregar algo a la propiedad DbSet <> me da el error en negrita anterior.

¿Alguien sabe por qué sucede esto? ¿Por qué debería DbContext preocuparse por las entidades de otro contexto específicamente uno de una clase derivada ObjectContext.

perhapse que es útil tomar nota de la entidad a la que se queja se ve un poco como esta

[EdmEntityTypeAttribute(NamespaceName="Irma2Model", Name="AccessProvider")] 
[Serializable()] 
[DataContractAttribute(IsReference=true)] 
public partial class AccessProvider : EntityObject 
{ 
    /*****...... ******/ 
} 
+1

pienso Tengo el mismo problema. Tenía dos EDMX DB-first mapeando diferentes tablas del mismo DB y ahora he cambiado uno de ellos al modelo más nuevo EF4.1 DbContext/POCO. Sin embargo, cuando intento usar este último, obtener un error sobre un modelo que falta para una tabla en el otro EDMX. Tal vez esta respuesta es relevante?: http://stackoverflow.com/questions/3521497/how-does-ms-entity-framework-map-from-the-conceptual-model-to-clr-types. Tenga en cuenta que creo que tiene un error tipográfico en su publicación "se queja de no tener un modelo conceptual para una entidad que pertenece al contexto de DB B", quiere decir DB A ¿verdad? – zeroid

+1

http://stackoverflow.com/questions/6899567/mixing-model-first-and-code-prime esto también. Sin respuesta, aunque – zeroid

Respuesta

6

encontrado una respuesta, no es lo que quiere oír sin embargo:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d2a07542-cb33-48ba-86ed-4fdc70fb3f1a

"Si está utilizando la generación de código predeterminada para el archivo EDMX, las clases generadas contienen una serie de atributos para ayudar a EF a encontrar qué clase usar para cada tipo de entidad. EF actualmente tiene una restricción de que las clases POCO no se pueden cargar desde un asno embly que contiene clases con los atributos EF. (La respuesta corta es no, tus clases deben estar en proyectos separados).

Esta es una restricción tanto artificial y algo que nos damos cuenta es doloroso y a tratar de eliminar en el futuro."

Así que la solución sería dividir las clases en dos conjuntos diferentes.

+1

Gracias por saltar en el fuego en este caso. Me acabas de salvar un par de horas. De todos modos, quería separar las clases de edmx en un ensamble separado. Debes preguntarte qué tipo de sobrecarga se está creando debajo de las fundas con EF. ¡Pensando seriamente en nhibernate en la próxima ronda! – drogon

Cuestiones relacionadas