Преобразование наследования Linq в Sql в несколько таблиц - PullRequest
2 голосов
/ 02 марта 2010

У меня проблемы с отображением наследования в Linq to Sql.Я использую MSDN в качестве ссылки, и в качестве основы это звучит хорошо.Однако приведенный пример представляет собой отображение наследования одной таблицы.Однако я пытаюсь сделать наследование нескольких таблиц, чтобы сэкономить на табличном пространстве.Это возможно?На данный момент у меня есть:

[Table(Name="writing_objs")]
[InheritanceMapping(Code="T",Type=typeof(ObjectTypeA), IsDefault=true)] // Only default because a default is required
[InheritanceMapping(Code="N",Type=typeof(ObjectTypeb))]
public abstract class WritingObject
{
    /* ... */

    [Column(Name="obj_tp", IsDiscriminator=true)]
    [StringLength(1)]
    public string ObjectType { get; set; }
}

Затем я определил различные типы объектов следующим образом:

[Table(Name="obj_type_a")]
public class ObjectTypeA: WritingObject
{
    /* Object Type A fields */
}

Кажется, проблема в том, что я определяю атрибут таблицы во втором типе, как я получаю следующее исключение:

Подтип наследования 'ObjectTypeA' также объявлен как корневой тип.

Возможно ли хранить эти поля в отдельных таблицахс Linq to Sql или мне придется объединить их все в одну таблицу?Обязательно ли плохо иметь несколько дополнительных полей в одной таблице, если их не слишком много (некоторые типы объектов могут даже совместно использовать некоторые поля)?

Ответы [ 2 ]

4 голосов
/ 02 марта 2010

Linq to SQL не поддерживает наследование нескольких таблиц с использованием дискриминатора, хотя является лучшим дизайном во многих случаях (он наиболее нормализован).

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

2 голосов
/ 25 февраля 2012

Хорошо, я знаю, что эта проблема уже решена, но, поскольку я только что столкнулся с той же проблемой, я хотел бы поделиться тем, что я сделал:

Просто удалите атрибут [Table] из ваших унаследованных классов. И это вполне логично, потому что мы определяем в обобщенных классах способ хранения всех подтипов (с дискриминационным атрибутом).

Может быть, это поможет кому-то в будущем.

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