Excepción al crear un esquema EDMX/DB usando Entity Framework 4 usando ContextBuilder con una clase genérica

StackOverflow https://stackoverflow.com/questions/1912333

Pregunta

estoy usando el Microsoft.Data.Entity.CTP (en Entity Framework CTP) bajo el marco .NET 4 para crear los metadatos EDMX de mis clases de C# para crear un esquema de base de datos.

Configuré un modelo simple como tal:

public class AModelContainer : ObjectContext
{
    public IObjectSet<RegularClass> RegularClasses { 
        get { return CreateObjectSet<RegularClass>(); }
    }
}

Sigo el patrón simple de definir un nuevo ContextBuilder basado en mi modelo.

var builder = new ContextBuilder<AModelContainer>();

using(var context = builder.Create(new SqlConnection(connString)))
{
    context.RegularClasses.AddObject(new RegularClass());

    context.SaveChanges();
}

esto funciona bien. Hasta Intento hacer algo un poco más complejo...

Extiendo mi modelo con una clase genérica.

public class AModelContainer : ObjectContext
{
    public IObjectSet<SpecialClass<string>> SpecialClasses { 
        get { return CreateObjectSet<SpecialClass<string>>(); }
    }
}

Ahora al guardar obtengo un excepción:

No se pudo encontrar información de mapeo y metadatos para EntityType 'Prototype.SpecialClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

En esta línea en el Un contenedor modelo:

return CreateObjectSet<SpecialClass<string>>();

El constructor predeterminado de mi 'SpecialClass' genérica no hace nada en este momento, ¿debería hacerlo?

public class SpecialClass<T> 
{
    public SpecialClass()
    { }
}

¿O es esto un problema con el Constructor de contexto Sin saber qué hacer exactamente, ¿hay alguna forma de utilizar builder.ComplexType() u otro método para guiarlo?

O el CTP aún no puede hacer frente a este escenario...

Eso "`1" después del nombre de mi clase tampoco me sienta bien en la excepción...

¿Fue útil?

Solución

No se puede utilizar clases genéricas como entidades con el objetivo EF (y por extensión de sólo código) de hoy.

Esto es una limitación de las capacidades de mapeado entre las CLR y el modelo conceptual.

Post Beta2 hemos añadido la capacidad de permitir este tipo de cosas:

public class Entity<TKey>
{
   public TKey ID {get;set;}
}

public class Person: Entity<int>
{
   public string Firstname {get;set;}
   public string Surname {get;set;}
}

Cuando sólo Person es una 'entidad' en el modelo de la EF, y la propiedad ID de la clase base se muestra como una propiedad de Person.

Sin embargo, no hay planes en .NET 4.0 / EF 4 a admitir la asignación de una misma clase genérica a una entidad en el modelo.

Espero que esto ayude

Alex

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top