Проблема реализации таблицы на иерархию и наследования - PullRequest
5 голосов
/ 18 мая 2010

Я перевожу старое ASP-приложение на современную версию .NET, чтобы сократить время разработки, которую мы рассматриваем .NET 4.0 Entity Framework. Однако мы, похоже, столкнулись с этой проблемой в нашей разработке.

Дается небольшая часть нашей базы данных: Таблица OBJECT, которая содержит список автомобилей и их соответствующих свойств. У нас также есть таблица OBJECT_OPTIONS, которая содержит для данного автомобиля в OBJECT список ОПЦИИ, АКСЕССУАРЫ и СТАНДАРТНОЕ ОБОРУДОВАНИЕ. Эти три типа имеют одинаковые поля и поэтому хранятся в одной и той же таблице. Столбец ncopt_type используется для различения разных списков. Возможные значения: «opt», «acc» и «sta». Таблица OBJECT_OPTIONS связывается с OBJECT через ncopt_obj_id, который представляет уникальный автомобиль (obj_id) в таблице OBJECT.

Наша цель - предоставить объекту OBJECT 3 свойства, которые связаны с различными списками OBJECT_OPTIONS: - Варианты собственности - имущество АКСЕССУАРЫ - имущество СТАНДАРТНОЕ ОБОРУДОВАНИЕ

Мы пробовали различные учебные пособия и пошаговые руководства, касающиеся таблиц на иерархию с помощью модели наследования, но не смогли создать построимую модель.

Технически, то, что мы сделали, было:

  • Создать объект ОБЪЕКТ
  • Создать объект OBJECT_OPTIONS, сделать его абстрактным
  • Добавить сущности OPTION, ACCESSORY и STANDARD_EQUIP, используя базовый тип OBJECT_OPTIONS
  • Добавить условия во все три таблицы в ncopt_type = '...'
  • Добавить 3 навигационных свойства в OBJECT, все из которых связаны с одним из унаследованных объектов: OPTIONS, ACCESSORIES и STANDAARD_EQUIPMENT

Во время этой настройки появляется куча ошибок, но в итоге мы получаем следующее:

Ошибка 3032: проблема в отображении фрагментов, начинающихся со строк 250, 286: EntityTypes NCO.Model.OPTION, NCO.Model.ACCESSOIRE, NCO.Model.STANDAARD_EQUIP отображаются в те же строки в таблице OBJECT_OPTIES. Условия сопоставления можно использовать для различения строк, в которые сопоставляются эти типы.

На всех трех объектах присутствует условие.

Я не нашел решения этой проблемы и потратил слишком много времени на нее. В настоящее время мы используем обходной метод, но нам хотелось бы исправить это, так как к концу проекта эта ситуация проявится еще несколько раз.

Любая помощь приветствуется, если вам нужна дополнительная информация, пожалуйста, напишите мне комментарий или по электронной почте.

1 Ответ

1 голос
/ 23 апреля 2011

Я не уверен, что вы можете сделать это на 100% изнутри дизайнера EF, но вы можете сделать это так:

  1. Создать объект ОБЪЕКТ (для примера я переименовал этот «Автомобиль»)
  2. Создать объект OBJECT_OPTIONS, сделать его абстрактным
  3. Добавить объекты OPTION, ACCESSORY и STANDARD_EQUIP, используя базовый тип OBJECT_OPTIONS
  4. Добавить условия для всех трех таблиц в ncopt_type = '...'

Затем добавьте нужные свойства, используя частичный класс для Vehicle:

using System.Collections.Generic;
using System.Linq;

public partial class Vehicle
{
    public IEnumerable<ACCESSORY> Accessories
    {
        get { return this.OBJECT_OPTIONS.OfType<ACCESSORY>(); }
    }

    public IEnumerable<OPTION> Options
    {
        get { return this.OBJECT_OPTIONS.OfType<OPTION>(); }
    }

    public IEnumerable<STANDARD_EQUIP> StandardEquipments
    {
        get { return this.OBJECT_OPTIONS.OfType<STANDARD_EQUIP>(); }
    }
}
...