Есть ли .NET Полиморфная Структура Данных - PullRequest
8 голосов
/ 14 января 2010

Я начинаю работу над новым проектом, который был бы намного проще, если бы был какой-то способ сделать разные модели данных полиморфными. Я смотрю на использование Entity Framework 4.0 (когда он выйдет), но не смог определить, сможет ли он действительно работать.

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 января 2010

Если вы разрабатываете свою «таблицу комментариев» так, чтобы она не зависела от типа комментариев (только основы, такие как идентификатор, дата и время, и текстовое содержимое), вы можете использовать одну дополнительную таблицу, которая отображает их все.

public interface ICommentable
{
   int CommentTypeCode
   int Id
   ...
}

Теперь таблица сопоставления содержит столбцы:

  • comment_type_code
  • target_object_id
  • comment_id

Ваши комментарии все идут в одной таблице с идентификатором Все ваши различные "целевые объекты" должны иметь идентификатор одного типа

Теперь вы можете произвольно добавлять новые «комментируемые» объекты в вашу систему, не изменяя таблицу комментариев или таблицу сопоставления - просто назначьте ей новый код типа и создайте таблицу с необходимым столбцом Id.

2 голосов
/ 14 января 2010

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

Например:

Сгенерированный код:

// this code is generated by a tool blah blah
partial class FooComment {
    // all the generated crap
    string Author {
        // ...
    }
    // etc
}

Интерфейс:

interface IComment{
    string Author{ get; }
    // etc
}

Мой код:

// lovingly hand-written by me
partial class FooComment : IComment {
}

Теперь, если вы хотите привести любую группу FooComments к IComment, используйте метод расширения Cast linq:

db.FooComments.Cast<IComment>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...