Exceção na criação de um DB-Schema EDMX / usando Entity Framework 4 usando ContextBuilder com uma classe genérica
-
19-09-2019 - |
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 ...
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