2010-05-18 4 views
5

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

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

Наша цель состоит в том, чтобы обеспечить OBJECT объект с 3-мя свойствами, которые ссылаются на различные списки OBJECT_OPTIONS: - свойство OPTIONS - недвижимость АКСЕССУАРЫ - свойство STANDARDEQUIPMENT

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

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

  • Создание сущностей ОБЪЕКТ
  • Создание сущностей OBJECT_OPTIONS, сделать его абстрактным
  • добавлять объекты OPTION, АКСЕССУАРА и STANDARD_EQUIP все с использованием BaseType OBJECT_OPTIONS
  • Добавить условия для всех три таблицы на ncopt_type = '...'
  • Добавьте к объекту 3 навигационных свойства, все связанные с одним из унаследованных объектов: ОПЦИИ, АКСЕССУАРЫ и СТЕНД AARD_EQUIPMENT

Куча ошибок показывает, во время этой установки, но мы в конечном итоге с этим:

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

Присутствует состояние на всех трех объектах.

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

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

+1

Так, ЭУ, никто не знает? –

+0

Казалось бы, нет. У меня такая же проблема ... может быть, это просто двое! – Stimul8d

+0

Не могли бы вы приложить изображение соответствующих таблиц и соответствующих объектов из edmx? - Это поможет прояснить, что вы пытаетесь сделать. Оставьте комментарий здесь после редактирования. –

ответ

1

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

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

Затем добавьте в свойствах, которые вы хотите с помощью частичного класса для автомобиля:

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>(); } 
    } 
} 
+0

Привет, Стив, мы отказались от этого метода после того, как ему потребовалось много времени, чтобы разобраться. Мы можем забрать его снова в будущем выпуске. Когда мы это сделаем, я попробую ваше решение. На данный момент кажется, что ваше решение может работать, поэтому я буду отмечать его как принятое. Спасибо, что нашли время ответить на это. –

+0

Нет проблем вообще :) –

Смежные вопросы