EntitySet System.InvalidOperationException: "el tipo de entidad no es parte del modelo para el contexto actual"
El tipo de entidad <nombre_clase> no forma parte del modelo para el contexto actual -y-Código de EF 4.1 Primer error: el tipo de entidad SomeType no forma parte del modelo para el contexto actual son preguntas similares pero son solo la perspectiva de "código primero", con modelos de datos mucho más simples y que abordan los problemas de asignación y cadena de conexión. Por favor, mira de cerca este.
Síntoma// HomeController.cs
public ActionResult Index()
{
var _db = new MealsContext();
var m = _db.Meals.ToList();
var d = _db.Drinks.ToList();
return View();
}
Se lanza una excepción recuperando elDrinks
colección:
The entity type Drink is not part of the model for the current context.
Código// 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; }
}
Sí, sé que en el mundo real la relación entre la carne y los vegetales con las comidas probablemente sería de muchos a muchos, pero no se obsesione con esto aquí.
// 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; }
}
Mi experiencia fue en el uso de una metodología Model First. El archivo EDMX fue construido entonces los POCOs.
En la cadena de conexión se encuentra la sección de metadatos que se asigna a los recursos EDMX analizados (metadata=res://*/Models.MealsModels.csdl|res://*/Models.MealsModels.ssdl|res://*/Models.MealsModels.msl;
).
Examiné el XML subyacente del archivo EDMX que muestra todas las entidades presentes en los modelos Conceptual y Store, y todas están completamente mapeadas. WTF?
Solución de problemasEl primer intento fue deshacerse completamente de la tienda y mapear los datos EDMX (elSSDL
yMSL
secciones). Dispara, y ahora hay dos excepciones:
RecuperandoMeals
arrojaMSL, error 2062 No mapping specified for instance of the EntitySet and AssociationSet in the EntityContainer
.
RecuperandoDrinks
sigue tirandoThe entity type Drinkis not part of the model for the current context
.
El error lanzado porMeals
es esperado, nuké las asignaciones y el modelo de tienda - examinando_db
me muestra queMeals
->InternalSet
->EntitySet
La propiedad es correcta, simplemente no asignada.
El error lanzado porDrinks
es donde estoy atascado. Examinando_db
más cerca me muestra queDrinks
->InternalSet
->EntitySet
arroja elSystemInvalidOperation
excepción que indica que la entidad no está en el contexto modelo.
Así es como se ve el CSDL de EDMX en formato XML:
<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>
PreguntaSi elDbContext
tiene todo elDbSet
propiedades y consume una cadena de conexión que incluye metadatos para un modelo cuyo CSDL define correctamente el tipo de entidadDrink
, ¿Por qué demonios no es parte del contexto?
Lo único diferente deDrink
lo que puedo ver es que no está relacionado con ninguna otra entidad, y no tiene asociaciones ...