Классы для сущностей; Проблемы наследственного класса - PullRequest
1 голос
/ 10 мая 2010

Помимо работы, мы с друзьями пытаемся создать какую-то игру; То, как мы структурируем некоторые из них, работает довольно хорошо для обычного объектно-ориентированного подхода, но, как подтвердит большинство разработчиков, это не всегда хорошо переводится в постоянный подход к базе данных.

Это не абсолютная схема того, что у нас есть, это просто примерная модель, представленная для наглядности.

Весь проект выполняется на C # 4.0, и мы намерены использовать Entity Framework 4.0 (если только Fluent nHibernate не сможет предложить нам то, чего мы не можем сделать в EF).

Одной из проблем, с которыми мы постоянно сталкиваемся, является наследование вещей в моделях баз данных. Используя конструктор Entity Framework, я могу нарисовать тот же код, что и ниже; но я уверен, что довольно очевидно, что это не работает так, как ожидается.

Чтобы уточнить немного; «Предметы» имеют бонусы, которые могут быть любыми. Следовательно, каждая часть игры должна происходить из чего-то подобного, так что, независимо от того, что «изменилось», все это на достаточно базовом уровне, чтобы его можно было подключить. Звучит довольно просто и понятно, верно?

Итак, мы наследуем все, что относится к игре, от «Юнитов». Веса, Меры, Случайные (думайте как кости, может быть?), И будут другие подобные объекты. Некоторые из них похожи, но в коде они будут реагировать по-своему.

У нас действительно большая проблема с абстрагированием такого рода вещей в модель базы данных. Без поддержки Enum трудно перевести ее в несколько таблиц, которые по-прежнему имеют общий список. Одним из решений, которое мы изобразили, является использование подхода типа «брелок», в котором все, что прикреплено к символу, хранится в «кольце» с «ключом», где каждый ключ имеет значение, представляющее тип. Это работает функционально, но мы обнаружили, что оно становится очень вялым и плохо работает. Нам также не нравится этот подход, потому что он начинает чувствовать, как будто все «сброшено» в один класс; что затрудняет соблюдение управления и логической структуры.

Я надеялся, что у кого-то еще могут быть какие-то идеи относительно того, что я мог бы сделать с этой проблемой. Это действительно гонит меня вверх по стене; К суммируем ; цель состоит в том, чтобы создать тип (Unit), который можно использовать в качестве базового типа (таблица на тип) для общей ссылки в относительно глобальной области, без необходимости выгрузки всего в одну коллекцию. Я могу использовать интерфейс для определения фактического поведения , так что это не слишком большая проблема.

альтернативный текст http://img171.imageshack.us/img171/5153/modelg.png

Это «примерно» та же идея, выраженная в Entity Framework.

альтернативный текст http://img684.imageshack.us/img684/6454/entities.png

1 Ответ

1 голос
/ 10 мая 2010

Вы пробовали таблицу для каждого типа картографирования для юнитов? т.е. использовать поле Id для связи таблиц Measure, Weights и Random? (у каждого есть столбец Id, и они связаны через это.)

Я думаю, что отношения, которые вы показываете между Sheet и Measure, будут проблематичными в отображении таблицы на класс. Лист не может быть сопоставлен только с измерениями, если тип единицы измерения 'мера' определяется столбцом дискриминатора в единицах измерения. С помощью TPCT вы можете успешно сопоставить Sheet и Measure, поскольку он может использовать Id для «возврата» в таблицу Units.

К сожалению, примеров для TPCT очень мало: иногда кажется, что требуется несколько итераций {редактировать модель, экспортировать базу данных, вносить изменения в SSMS, импортировать базу данных} ..., чтобы получить это правильно.

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