Предотвращение конфликтов «уникального поля» при наследовании - PullRequest
0 голосов
/ 02 октября 2011

Моя ситуация

У меня есть сущностная модель с базовым классом ItemBase, который определяет идентификатор, имя и несколько других свойств. Столбец «ID» - это идентификатор, столбец «Имя» - это уникальное поле в базовой таблице . Этот базовый класс также определяется как абстрактный класс. Так что да, это таблица в базе данных, но в EF4 я не могу создавать экземпляры этого базового класса.

И у меня есть пять разных сущностей, которые наследуются от базового класса. (Item1, Item2 ... Item5) Таким образом, все они наследуют свойства ItemBase, а дополнительные свойства хранятся в альтернативной таблице. Одна таблица для каждого типа. Довольно мило, на самом деле!

Моя проблема

Объект типа Item2 может иметь то же имя, что и объект Item5. Это может вызвать проблемы, так как они оба будут иметь запись в таблице ItemBase, а поле Имя будет конфликтовать. Это просто противно. Таким образом, если класс Item2 содержит бренды производителей телевизоров, а Item5 содержит списки производителей смартфонов, «Samsung» нельзя добавить в оба набора объектов.

Мне нужно решение, которое обойдет эту проблему, оставляя ее простой. (И без добавления поля Name во все дочерние таблицы, потому что YUCK!) Предложения?

Как решить эту проблему?

Поскольку «Имя» находится в базовой таблице и определено как «Уникальное», я столкнусь с конфликтами, когда два разных класса сущностей имеют одно и то же имя. Мне нужно решение, где «Имя» находится в базовой таблице, но оно уникально только для дочернего класса, а не уникально для базового класса ...
Я мог бы изменить дочерние объекты, добавив префикс к имени при записи в таблицу и снова удалив его при чтении из таблицы. Или я добавляю другое поле в базовую таблицу, указывающее связанный с ним дочерний класс, и делаю «имя» + «ссылка» уникальным вместо просто «Имя». Оба решения не очень красивые, и мне неясно, как реализовать одно из них. Так есть ли лучшее решение или как мне это реализовать?

1 Ответ

3 голосов
/ 03 октября 2011

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

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

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