EntitySet System.InvalidOperationException - “o tipo de entidade não faz parte do modelo para o contexto atual”
O tipo de entidade <classname> não faz parte do modelo para o contexto atual -e-Código EF 4.1 Primeiro erro - O tipo de entidade SomeType não faz parte do modelo para o contexto atual são questões semelhantes, mas são apenas uma perspectiva de "código primeiro", com modelos de dados muito mais simples, e abordam problemas de cadeia de conexão e mapeamento. Por favor, olhe atentamente para este.
Sintoma// HomeController.cs
public ActionResult Index()
{
var _db = new MealsContext();
var m = _db.Meals.ToList();
var d = _db.Drinks.ToList();
return View();
}
Exceção é lançada recuperando oDrinks
coleção:
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; }
}
Sim, eu sei que no mundo real a relação entre carne e vegetais com refeições provavelmente seria muitos-para-muitos, mas não fique preso a isso aqui.
// 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; }
}
Minha experiência foi no uso de uma metodologia Model First. O arquivo EDMX foi construído em seguida, os POCOs.
Na cadeia de conexão, está a seção de metadados que mapeia para os recursos EDMX analisados (metadata=res://*/Models.MealsModels.csdl|res://*/Models.MealsModels.ssdl|res://*/Models.MealsModels.msl;
).
Eu examinei o XML subjacente do arquivo EDMX mostra todas as entidades presentes em modelos conceituais e de armazenamento, e todos são totalmente mapeados. WTF
Solução de problemasA primeira tentativa foi livrar-se completamente da loja e mapear os dados da EDMXSSDL
eMSL
Seções). Dispare, e agora existem duas exceções:
RecuperandoMeals
lançaMSL, error 2062 No mapping specified for instance of the EntitySet and AssociationSet in the EntityContainer
.
RecuperandoDrinks
continua a jogarThe entity type Drinkis not part of the model for the current context
.
O erro lançado porMeals
é esperado, eu nuked os mapeamentos e modelo de loja - examinando_db
me mostra issoMeals
->InternalSet
->EntitySet
a propriedade está correta, apenas não mapeada.
O erro lançado porDrinks
é onde estou preso. Examinando_db
mais perto me mostra queDrinks
->InternalSet
->EntitySet
lança oSystemInvalidOperation
exceção que indica que a entidade não está no contexto do modelo.
Aqui está o que parece o CSDL do EDMX no 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>
QuestãoSe oDbContext
tem todo oDbSet
propriedades e está consumindo uma cadeia de conexão que inclui metadados para um modelo que define CSDL corretamente o tipo de entidadeDrink
, Por que diabos isso não faz parte do contexto?
A única coisa diferente sobreDrink
que eu posso ver é que não está relacionado a nenhuma outra entidade e não tem associações ...