EntitySet-System.InvalidOperationException - "der entity-Typ ist nicht Teil des Modells für den aktuellen Kontext"
Ähnliche Fragen
Der entity-Typ <classname> ist nicht Teil des Modells für den aktuellen Kontext -und- EF 4.1 Code Erste Fehler - Der entity-Typ SomeType ist nicht Teil des Modells für den aktuellen Kontext sind ähnliche Fragen, aber Sie sind "code first" - Perspektive nur mit sehr viel einfachere Datenmodelle und Adresse Verbindungszeichenfolge-und mapping-Themen. Bitte schauen Sie genau auf dieser.
Symptom
//HomeController.cs
public ActionResult Index()
{
var _db = new MealsContext();
var m = _db.Meals.ToList();
var d = _db.Drinks.ToList();
return View();
}
Ausnahme geworfen wird, ist das abrufen der Drinks
Sammlung:
The entity type Drink is not part of the model for the current context.
- Code
//Meal.cs
public class Meal
{
public int Id { get; set; }
public string Stuff { get; set; }
public virtual ICollection<Meat> Meats { get; set; }
public virtual ICollection<Vegetable> Vegetables { get; set; }
}
//Meat.cs
public class Meat
{
public int Id { get; set; }
public string Name { get; set; }
public int MealId { get; set; }
}
//Vegetable.cs
public class Vegetable
{
public int Id { get; set; }
public string Name { get; set; }
public int MealId { get; set; }
}
//Drink.cs
public class Drink
{
public int Id { get; set; }
public string Name { get; set; }
}
Ja, ich weiß, in der realen Welt das Verhältnis zwischen Fleisch und Gemüse mit Mahlzeiten würde wahrscheinlich viele-zu-Viele, aber nicht bekommen aufgehängt drauf hier.
//MealsContext.cs
public class MealsContext: DbContext
{
public MealsContext() : base("ConnectionString")
public DbSet<Meal> Meals{ get; set; }
public DbSet<Meat> Meats{ get; set; }
public DbSet<Vegetable> Vegetables { get; set; }
public DbSet<Drink> Drinks{ get; set; }
}
Meine Erfahrung war mit einem Modell der Ersten Methode. Die EDMX-Datei gebaut wurde, dann die POCOs.
In der Verbindungszeichenfolge ist die Metadaten-Abschnitt, der die Karten auf das geparste EDMX-Ressourcen (metadata=res://*/Models.MealsModels.csdl|res://*/Models.MealsModels.ssdl|res://*/Models.MealsModels.msl;
).
Ich untersuchte die zugrunde liegenden XML-Code der EDMX-Datei zeigt alle Elemente vorhanden, die in Konzeptionelle und Lagern-Modelle, und alle sind vollständig kartiert. WTF???
Fehlerbehebung
Der erste Versuch war, um vollständig loszuwerden, die store-und EDMX mapping Daten (die SSDL
und MSL
Abschnitte). Feuer Weg, und jetzt gibt es zwei Ausnahmen:
- Abrufen
Meals
wirftMSL, error 2062 No mapping specified for instance of the EntitySet and AssociationSet in the EntityContainer
. - Abrufen
Drinks
weiter zu werfenThe entity type Drinkis not part of the model for the current context
.
Den Fehler ausgelöst, indem Meals
erwartet, ich schob die Zuordnungen und speichern von Modell-Prüfung _db
zeigt mir, dass Meals
-> InternalSet
-> EntitySet
Eigenschaft ist korrekt, nur nicht abgebildet.
Den Fehler ausgelöst, indem Drinks
ist, wo ich geblieben bin. Die Prüfung _db
näher zeigt mir, dass Drinks
-> InternalSet
-> EntitySet
wirft die SystemInvalidOperation
Ausnahme, die besagt, dass die Entität nicht in der Modell-Kontext.
Hier ist, was die EDMX - CSDL sieht aus wie die im XML-format:
<edmx:ConceptualModels>
<Schema ...>
<EntityContainer Name="MealsContext" annotation:LazyLoadingEnabled="true">
<EntitySet Name="Meals" EntityType="Models.Meal" />
<EntitySet Name="Meats" EntityType="Models.Meat" />
<EntitySet Name="Vegetables" EntityType="Models.Vegetable" />
<EntitySet Name="Drinks" EntityType="Models.Drink" />
<!-- AssociationSets here for the FKs -->
</EntityContainer>
<!-- All are present, but here's the culprit Drink -->
<EntityType Name="Drink">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="String" Name="Name" Nullable="false" MaxLength="200" FixedLength="false" Unicode="true" />
</EntityType>
<!-- Associations here -->
</Schema>
</edmx:ConceptualModels>
Frage
Wenn die DbContext
hat alle DbSet
Eigenschaften und verbraucht eine Verbindungszeichenfolge enthält die Metadaten für ein Modell, wer CSDL korrekt definiert das entity-Typ Drink
, warum in der Hölle ist es nicht Teil des Kontexts?
Nur, was andere über Drink
dass ich sehen kann, ist, dass es nicht mit anderen Personen, und hat keine Verbände...
InformationsquelleAutor one.beat.consumer | 2012-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gelöst.
Die erste Hälfte war mein versehen. Die zweite Hälfte... nun, ich don ' T haben eine Wort für das, was falsch war. Es ist nicht wirklich ein bug oder Inkompatibilität, sondern etwas sehr unbequem, der intermittierenden und schwer zu verstehen. Zuerst eine Zusammenfassung und dann der Länge nach Erklärung für diejenigen die es interessiert:
Trotz der Fehlermeldung Anregungen, es war nicht ein problem mit dem konzeptionellen Modell (CSDL), aber eine Spalte Zuordnung Problem, dass neu sich zeitweise.
Dem konzeptionellen Modell wurde mit Hilfe der
EdmxWriter
zu analysieren, dieDbContext
und die Ihr zugrunde liegenden Stücke.Das Modell wurde dann verwendet, um SQL-Skripts generieren, um die push-schema, um eine neue Datenbank. Der trick ist, die Datenbank ist Oracle.
Oracle ist ein baby und akzeptiert nicht lange Spaltennamen. Also die generierte EDMX-und SQL-Skripts geändert werden musste, zu bauen und die Karte Teile des konzeptionellen Modells, um abgeschnitten Spaltennamen.
Nicht wirklich eine große Sache. Es funktioniert einwandfrei. Also wo haben die Dinge schief gehen?
Oracle unterstützt keine "code first". Und auch wenn es manuell durchgeführt wurde, mit der
EdmxWriter
stellt einen code-first-Ansatz in Oracle ' s Augen. So, wenn die ersten EDMX-schema analysiert wird, gemeckert über booleschen Zuordnungen. Die Lösung war, entfernen Sie vorübergehend die bools aus meinem C# - Modelle, fügen Sie zu der EDMX manuell und die web -.config-mapping Oracle schlägt (mappingbool
zuNUMBER(1,0)
).Alles, was groovt wieder. Warum aber gibt es immer wiederkehrende?
Zu unterschiedlichen Zeiten während des gesamten Entwicklungsprozesses einige endet der Vertrag - entweder C#, EDMX -, oder Oracle - verändert werden. Und jedes mal scheint es, dass die Spalten automatisch neu zugeordnet und ich ahnungslos war. Wenn Sie die EDMX-Modell wurde aktualisiert, von Oracle, die Zuordnungen wurden zeigt auf C# - Eigenschaften, die nicht existieren (die kurze Spaltennamen). Wenn das Modell aktualisiert von C# - code die Zuordnungen waren nicht erhalten, und Sie versuchten die Karte zu lange Spaltennamen, die nicht in Oracle.
Den Mist mit diesem Ansatz (Art hybrid code first und model first -), wenn ich wollen weiterhin Geschäftsführer meiner eigenen Modelle und der Behandlung von Anpassungen, die notwendig für Oracle ' s kleines baby-Haltung, muss ich sehr vorsichtig und überwachen Sie die Hölle aus der EDMX-Datei.
Zum Zeitpunkt von diesem post, Oracle ODP.NET Paket hat keine Unterstützung für code-first-Entwicklung. Nun, dass beide es-und EF herangereift, es ist ein solider Ansatz.
In meinem Fall war das problem, dass ich hatte eine alte version von der POCO-Objekt, auf das verwiesen wird.
InformationsquelleAutor one.beat.consumer
Müssen Sie die Zuordnungen für Ihr Unternehmen:
Ich hatte das gleiche problem, bis ich begann mit Entity Framework Power Tools
Verwenden, können Sie erzeugen klare Entitäten wie einem business-Objekte und mapping-Klassen.
Guter Artikel, hat mir geholfen, zu erstellen erstaunlich, data access layer: Reverse Engineering Von Code First
OnModelCreating
wird nie aufgerufen, und die Fluent-API ist off limits. Das ist es, was die EDMX-xml-Zeug ist für.InformationsquelleAutor Vlad Omelyanchuk