EntitySet System.InvalidOperationException - „typ encji nie jest częścią modelu dla bieżącego kontekstu”
Jednostka typu <nazwa klasy> nie jest częścią modelu dla bieżącego kontekstu -i-EF 4.1 Kod Pierwszy błąd - typ jednostki SomeType nie jest częścią modelu dla bieżącego kontekstu są podobnymi pytaniami, ale są one tylko perspektywą „kodową”, ze znacznie prostszymi modelami danych i dotyczą ciągów połączeń i problemów z mapowaniem. Przyjrzyj się dokładnie temu.
Objaw// HomeController.cs
public ActionResult Index()
{
var _db = new MealsContext();
var m = _db.Meals.ToList();
var d = _db.Drinks.ToList();
return View();
}
Wyjątek jest wyrzucany z odzyskiwaniemDrinks
kolekcja:
The entity type Drink is not part of the model for the current context.
Kod// 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; }
}
Tak, wiem w prawdziwym świecie, że związek między mięsem i warzywami z posiłkami prawdopodobnie byłby wiele do wielu, ale nie daj się na tym zawiesić.
// 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; }
}
Moje doświadczenie polegało na stosowaniu metodologii Model First. Plik EDMX został zbudowany następnie POCO.
W łańcuchu połączenia znajduje się sekcja metadanych, która odwzorowuje przeanalizowane zasoby EDMX (metadata=res://*/Models.MealsModels.csdl|res://*/Models.MealsModels.ssdl|res://*/Models.MealsModels.msl;
).
Zbadałem bazowy XML pliku EDMX, który pokazuje wszystkie elementy obecne w modelach koncepcyjnych i sklepowych, a wszystkie są w pełni zmapowane. WTF?
Rozwiązywanie problemówPierwszą próbą było całkowite pozbycie się sklepu i mapowanie danych EDMX (SSDL
iMSL
Sekcje). Odpalaj, a teraz są dwa wyjątki:
AportMeals
rzucaMSL, error 2062 No mapping specified for instance of the EntitySet and AssociationSet in the EntityContainer
.
AportDrinks
nadal rzucaThe entity type Drinkis not part of the model for the current context
.
Błąd rzucony przezMeals
oczekuje się, że pobiłem mapowania i model sklepu - badając_db
pokazuje mi toMeals
->InternalSet
->EntitySet
właściwość jest poprawna, tylko nie mapowana.
Błąd rzucony przezDrinks
gdzie utknąłem. Badanie_db
bliżej mi to pokazujeDrinks
->InternalSet
->EntitySet
rzucaSystemInvalidOperation
wyjątek, który stwierdza, że jednostka nie znajduje się w kontekście modelu.
Oto jak wygląda CSDL EDMX w formacie 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>
PytanieJeśliDbContext
ma wszystkoDbSet
właściwości i zużywa ciąg połączenia, który zawiera metadane dla modelu, który CSDL poprawnie definiuje typ encjiDrink
, dlaczego u diabła nie jest częścią kontekstu?
Jedyna rzecz innaDrink
widzę, że nie jest powiązany z żadnymi innymi podmiotami i nie ma powiązań ...