EntitySet System.InvalidOperationException - «тип сущности не является частью модели для текущего контекста»

Подобные вопросы

Тип сущности <classname> не является частью модели для текущего контекста -а также-EF 4.1 Код Первая ошибка - тип объекта SomeType не является частью модели для текущего контекста являются похожими вопросами, но они представляют собой перспективу «сначала кода», с гораздо более простыми моделями данных, а также с проблемами строк подключения и сопоставления. Пожалуйста, внимательно посмотрите на это.

симптом
// HomeController.cs
public ActionResult Index()
{
    var _db = new MealsContext();

    var m = _db.Meals.ToList();
    var d = _db.Drinks.ToList();

    return View();
}

Исключение выдается при полученииDrinks коллекция:

The entity type Drink is not part of the model for the current context.
Код
// 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; }
}

Да, я знаю, что в реальном мире отношения между мясом и овощами с едой, вероятно, были бы «многие ко многим», но не зацикливайтесь на этом здесь.

// 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; }
}

Мой опыт был в использовании методологии Model First. Файл EDMX был построен тогда POCOs.

В строке подключения находится раздел метаданных, который отображается на проанализированные ресурсы EDMX (metadata=res://*/Models.MealsModels.csdl|res://*/Models.MealsModels.ssdl|res://*/Models.MealsModels.msl;).

Я изучил базовый XML-файл EDMX, в котором показаны все объекты, присутствующие в моделях Conceptual и Store, и все они полностью сопоставлены. WTF?

Поиск неисправностей

Первой попыткой было полностью избавиться от хранилища и отображения данных EDMX (SSDL а такжеMSL секции). Пожар, и теперь есть два исключения:

ПолучениеMeals бросаетMSL, error 2062 No mapping specified for instance of the EntitySet and AssociationSet in the EntityContainer.

ПолучениеDrinks продолжает бросатьThe entity type Drinkis not part of the model for the current context.

Ошибка, брошеннаяMeals Ожидается, я обстрелял сопоставления и модель магазина - изучая_db показывает мне, чтоMeals ->InternalSet ->EntitySet свойство верное, только не сопоставлено.

Ошибка, брошеннаяDrinks это где я застрял. Изучение_db ближе показывает мне, чтоDrinks ->InternalSet ->EntitySet бросаетSystemInvalidOperation исключение, в котором говорится, что объект не находится в контексте модели.

Вот как CSDL EDMX выглядит в формате 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>
Вопрос

ЕслиDbContext имеет всеDbSet свойства и использует строку подключения, которая включает метаданные для модели, которая CSDL правильно определяет тип объектаDrink, почему, черт возьми, это не является частью контекста?

Единственное, что отличаетсяDrink я вижу, что он не связан ни с какими другими объектами и не имеет ассоциаций ...

Ответы на вопрос(2)

Ваш ответ на вопрос