Eccezione sulla creazione di un EDMX / DB-Schema utilizzando Entity Framework 4 utilizzando ContextBuilder con una classe generica
-
19-09-2019 - |
Domanda
Sto utilizzando il Microsoft.Data.Entity.CTP (in Entity Framework CTP) nel quadro .NET 4 per creare i metadati EDMX dalle mie classi C # per creare uno schema di database.
I ha installato un modello semplice in quanto tale:
public class AModelContainer : ObjectContext
{
public IObjectSet<RegularClass> RegularClasses {
get { return CreateObjectSet<RegularClass>(); }
}
}
seguo il modello semplice di definire una nuova ContextBuilder basata sul mio modello.
var builder = new ContextBuilder<AModelContainer>();
using(var context = builder.Create(new SqlConnection(connString)))
{
context.RegularClasses.AddObject(new RegularClass());
context.SaveChanges();
}
Questo funziona bene . Fino che cerco di fare qualcosa di un po 'più complesso ...
Estendo il mio modello con una classe generica
public class AModelContainer : ObjectContext
{
public IObjectSet<SpecialClass<string>> SpecialClasses {
get { return CreateObjectSet<SpecialClass<string>>(); }
}
}
Ora sul risparmio ottengo un eccezione :
Informazioni Mappatura e metadati non è stata trovata per EntityType 'Prototype.SpecialClass`1 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]]'.
In questa riga nel AModelContainer :
return CreateObjectSet<SpecialClass<string>>();
Il costruttore di default della mia generica 'SpecialClass' non fa nulla in questo momento, dovrebbe?
public class SpecialClass<T>
{
public SpecialClass()
{ }
}
O si tratta di un problema con il ContextBuilder , non sapendo cosa fare esattamente, c'è un modo per utilizzare builder.ComplexType (), o altro metodo per guidarlo?
O il CTP non può occuparsi di questo scenario ancora ...
Questo "` 1 " dopo il mio nome della classe, inoltre, non mi sta bene in salvo ...
Soluzione
Non è possibile utilizzare classi generiche come entità con l'EF (e per estensione Codice-Only) di oggi.
Questa è una limitazione delle funzionalità di mapping tra il CLR e il modello concettuale.
Post Beta2 abbiamo aggiunto la possibilità di permettere questo genere di cose:
public class Entity<TKey>
{
public TKey ID {get;set;}
}
public class Person: Entity<int>
{
public string Firstname {get;set;}
public string Surname {get;set;}
}
Dove solo Person
è un 'entità' nel modello della EF, e la proprietà ID
dalla classe base si presenta come una proprietà di Person
.
Ma non ci sono piani in .NET 4.0 / EF 4 per supportare la mappatura di una classe generica per sé ad un'entità nel modello.
Spero che questo aiuti
Alex