Объект Fw 4, MVC3, производный класс не отображается в ObjectContext - PullRequest
0 голосов
/ 19 января 2012

Я использую MVC3 с EF (версия 4, но не уверен, что 4.0.4.1 и т. Д.). Я боролся с этим со вчерашнего дня, и я нигде не нахожу ответа. Я использую книгу "Pro Entity Framework 4.0".

Я использовал подход Model First, и потому что я хочу использовать наследование, я создал базовую модель для проведения первых тестов (извините, нажмите на ссылку, у меня недостаточно представителя для размещения изображения):

Модель EF

Затем с этой моделью я создал базу данных. Я не очень доволен соглашением об именах, потому что, несмотря на множественное число имен сущностей, для таблицы производного класса было создано имя таблицы с префиксом-одиночкой. Извините, у меня не установлена ​​SSMS, но посмотрите через обозреватель сервера, см. Рисунок:

БД, созданная на основе модели EF

Затем я создал контроллеры для BaseClass с шаблоном «Контроллер с действиями чтения / записи и представлениями, используя Entity Framework». Работает отлично! Здесь созданы все виды CRUD.

Например, в представлении Details у меня есть этот код:

//
    // GET: /BaseClass/Details/5

    public ViewResult Details(int id)
    {
        BaseClass baseclass = db.BaseClasses.Single(b => b.Id == id);
        return View(baseclass);
    }

Работает нормально.

Затем я сделал то же самое для DerivedClass и получил контроллер со всеми действиями CRUD и представлениями. А теперь проблема. Например, контроллер Details DerivedClass выглядит следующим образом:

//
    // GET: /DerivedClass/Details/5

    public ViewResult Details(int id)
    {
        DerivedClass derivedclass = db.BaseClasses.Single(d => d.Id == id);
        return View(derivedclass);
    }

Как вы можете видеть, он пытается получить db.BaseClasses вместо db.DerivedClasses, с ошибкой компиляции, но db не предоставляет никакого доступа к сущности DerivedClass, в db нет ничего общего с DerivedClass.But если я создаю вручную экземпляр DerivedClass в коде, то это возможно:

MyNamespace.Blablabla.Site.Models.DerivedClass dev = new Models.DerivedClass();

Я что-то упустил? Заранее спасибо.

1 Ответ

1 голос
/ 19 января 2012

Иерархии наследования отображаются на один DbSet.Если вы хотите фильтровать унаследованные объекты, вы можете использовать:

  DerivedClass derivedclass = db.BaseClasses.OfType<DerivedClass>().Single(d => d.Id == id);

OfType<>() фильтрует набор объектов для экземпляров указанного вами типа.

Для добавления и обновления производной сущности вы также можете использовать родительский DbSet, и EF отобразит его в правильные таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...