Я начинаю работу над новым проектом, который это, было бы намного легче, если бы был некоторый способ сделать различные модели данных полиморфными. Я смотрю на использование Платформы Объекта 4.0 (когда это выпущено), но не могли определить, сможет ли это на самом деле работать.
Вот основной сценарий. Я реализован система комментария и хотел бы смочь подключить ее ко многим различным типам моделей. Возможно, я хочу комментарии к профилю человека, и комментирует веб-страницу. Путем я сделал бы, это в прошлом должно создать отношения между таблицей человека и таблицей комментария отдельно от отношений между таблицей веб-страницы и таблицей комментария. Я думаю, что это приводит к чрезмерно сложной структуре таблицы в базе данных, как бы то ни было.
Было бы лучше, если я мог бы просто смочь добавить интерфейс к объектам, я хочу комментарии и затем упрощаю структуру таблицы в базе данных к единственным отношениям.
Проблема, с которой я сталкиваюсь, состоит в том, что я, кажется, не знаю правильную терминологию для нахождения информации о том, как сделать этот тип вещи. Любая справка, которую любой может обеспечить, значительно ценилась бы.
Если вы проектируете свои «таблицы комментариев», чтобы быть комментарием типа-агностик (просто основ, как идентификатор, дата и время, а также контент текста), вы можете затем использовать один дополнительный Таблица, которая отображает их всех.
public interface ICommentable
{
int CommentTypeCode
int Id
...
}
Теперь, когда таблица Mapber содержит столбцы:
Ваши комментарии все идут в одной таблице, с идентификатором Ваши различные «целевые объекты» должны иметь идентификатор того же типа
, теперь вы можете произвольно добавлять новые «комментировать» объекты в вашу систему без изменения таблицы комментариев или таблицы Mapber - просто назначьте его код нового типа и Создайте таблицу с помощью реквизитной идентификационной колонки.
Я выполняю это с помощью 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, используйте
Метод расширения LINQ:
db.FooComments.Cast<IComment>()