Exceção na criação de um DB-Schema EDMX / usando Entity Framework 4 usando ContextBuilder com uma classe genérica

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

Pergunta

Eu estou usando o Microsoft.Data.Entity.CTP (no Entity Framework CTP) sob o framework .NET 4 para criar os metadados EDMX de minhas classes C # para criar um esquema de banco de dados.

Eu configurar um modelo simples como tal:

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

Eu sigo o padrão simples de definir um novo ContextBuilder baseado em meu modelo.

var builder = new ContextBuilder<AModelContainer>();

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

    context.SaveChanges();
}

Isso funciona bem . Até eu tento fazer algo um pouco mais complexo ...

Eu estendo o meu modelo com uma classe genérica

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

Agora, no save eu recebo um exceção :

Mapeamento e informações de metadados não pôde ser encontrado para EntityType 'Prototype.SpecialClass`1 [[System.String, mscorlib, versão = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]]'.

Nesta linha no AModelContainer :

return CreateObjectSet<SpecialClass<string>>();

O construtor padrão da minha 'SpecialClass' genérico não faz nada no momento, deveria?

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

Ou este é um problema com o ContextBuilder não saber o que fazer exatamente, há uma maneira de usar builder.ComplexType (), ou outro método para guiá-lo?

Ou a CTP não pode lidar com esse cenário ainda ...

Que "` 1 " depois de meu nome classe também não se sente bem comigo na exceção ...

Foi útil?

Solução

Você não pode usar classes genéricas como entidades com a EF (e, por extensão Code-Only) hoje.

Esta é uma limitação das capacidades de mapeamento entre o CLR eo modelo conceitual.

Depois Beta2 nós adicionamos a capacidade de permitir que esse tipo de coisa:

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

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

Quando somente Person é uma 'entidade' no modelo do EF, ea propriedade ID dos shows classe base como uma propriedade de Person.

Mas não há planos em .NET 4.0 / EF 4 para suportar o mapeamento em si uma classe genérica a uma entidade no modelo.

Espero que isso ajude

Alex

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top