2011-03-21 26 views
5

Tengo una subclase en un ensamblaje diferente a su clase base. El padre es una clase POCO utilizada para EF Code First.Entity Framework Code First y Multiple Assemblies

Cuando intento agregar una instancia de la clase heredada a la base de datos consigo InvalidOperationException:"mapeo de objetos no se pudo encontrar para el tipo de identidad 'Foo.Bar.MyInheritedClass'".

Funciona bien si la subclase está en el mismo ensamblaje que la clase base.

En EF regular el solution seems to be una llamada al ObjectContext.MetadataWorkspace.LoadFromAssembly (assembly). Pero no puedo entender cómo esto se relaciona con Code First.

Algún consejo?

Estoy usando Entity Framework 4.1 RC.

+1

¿Por qué todavía no puedes llamar a esa función? No he comprobado realmente, pero basado en una búsqueda rápida usted debe poder acceder al 'MetadataWorkspace' de su' DbContext' usando 'dbContext.MetadatWorkspace'. ¿Eso no funciona? –

+0

Sí, puede convertir DbContext en IObjectContextAdapter y recuperar su ObjectContext subyacente (Ver: http://weblogs.asp.net/jgalloway/archive/2011/01/21/fix-wcf-data-service-with-entity-framework -code-first-dbcontext-doesn-t-accept-updates.aspx). –

+0

Eso me permitió probar MetadataWorkspace.LoadFromAssembly() pero no solucionó mi problema :( –

Respuesta

3

He resuelto esto heredando del DbContext del primer ensamblaje, agregando un DbSet <> para la clase derivada y luego agregando nuevas instancias del tipo derivado a eso.

código Publicado en el foro de MSDN here.

+0

esta es una solución tonta –

2

Sé que este post es un poco viejo, pero yo era capaz de lograr esto usando @ recomendación de Dave dentro del constructor:

public Context() { 
    ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(
     System.Reflection.Assembly.GetAssembly(
      typeof(--[Inherited DbContext]--))); 
} 
1

Soy bastante nuevo a EF (Entity Framework 4) y recibí la misma excepción cuando hice cambios en el modelo.

Mi problema resultó ser que no sabía EF necesita todos los nombres en todas las propiedades de navegación para aceptar, no solo su tipo. Por ejemplo, si hay una propiedad de navegación llamada foo, entonces debe haber una variable declarada en la clase correspondiente con el mismo nombre.

Cuestiones relacionadas