EF4.1: Возможно ли иметь отношение от нуля или единицы до нуля или единицы (от 0,1 до 0,1) - PullRequest
3 голосов
/ 23 июня 2011

.NET 4.0 с SQL Server 2008 R2.Я пытаюсь представить отношение от 0..1 до 0..1 и получаю следующую ошибку:

Ошибка 113: множественность конфликтует с ссылочным ограничением в роли '{0}' вотношение "{1}".Поскольку все свойства в зависимой роли не имеют значения NULL, кратность основной роли должна быть равна 1.

Я получаю это сообщение, даже когда свойства в зависимой сущности равны1008 * обнуляется.Можно ли представить эту взаимосвязь в Entity Framework?

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

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

Нет, это невозможно, и я сомневаюсь, что это работает в SQL-сервере.Связь с базой данных требует, чтобы один конец стал зависимым.Это означает, что он ссылается на первичный ключ (PK) основного конца - мы называем этот внешний ключ (FK).Если мы говорим об отношении «один к одному», то FK должен быть помечен как уникальный, чтобы только одна запись в зависимой таблице могла ссылаться на данную запись из основной таблицы.Единственное допустимое отношение в этом случае - 0..1 - 1, где принципал может существовать без зависимого, но зависимый может существовать, только когда связан с существующим принципалом, потому что его значение FK должно быть установлено в значение PK субъекта.Теоретически FK может быть обнуляемым, но это зависит от того, как база данных реализует уникальные ограничения.Если база данных считает ноль как другое уникальное значение, только одна зависимая запись может иметь FK, установленный на ноль (я думаю, что это случай SQL-сервера).

В EF это еще сложнее, потому что EF не поддерживаетуникальные ограничения, и из-за этого вы можете построить взаимно-однозначное отношение, только когда FK в зависимом объекте также является его PK (= нет способа установить его в ноль).Если вы не можете установить для FK значение NULL, вы не сможете использовать его как NULL, и из-за этого основная сущность должна существовать, иначе ссылочная целостность выдаст ошибку.

Лучшее решение для вас - рассмотреть Request в качестве основной сущности и * 1006.* как зависимый.Сначала должен быть создан запрос, и он должен храниться в базе данных до тех пор, пока Result.Result должно иметь то же значение PK (столбец не может быть автоматически увеличен), как соответствующее Request (и PK должно быть от FK до Request).

1 голос
/ 09 мая 2013

Это было возможно несколькими способами в SQL 2008 (например, отфильтрованный индекс, ограничение для вычисляемого столбца) и является функциональностью по умолчанию для уникального индекса в SQL 2012.

Согласно стандартам ANSI SQL: 92В SQL: 1999 и SQL: 2003 ограничение UNIQUE должно запрещать дублирование значений, отличных от NULL, но допускает использование нескольких значений NULL.Поддержка SQL в этом достаточно недавняя, но не нестандартная.

Обратите внимание, что как отношение 0..1 ко многим может иметь ноль любого из них и все равно восприниматься как наличие зависимого столбца, так чтоОт 0..1 до 0..1.

Обратите внимание, что EF5 (более новый, чем этот ответ Ладислава) также поддерживает это, но направление зависимости определяется порядком, в котором 0..1устанавливается в дизайне, если вы используете Model-First.Тем не менее, он все еще кажется детерминированным.

0 голосов
/ 27 декабря 2012

Да, есть способ сделать то, что вы хотите: сделать обе таблицы подтипами другой таблицы. Это означает синхронизировать их значения PK, чтобы значение PK одной таблицы было равно соответствующему значению PK в другой таблице. Например, если обе таблицы имеют отдельные столбцы identity, их нужно будет заменить обычными столбцами, сгенерировать identity в другом месте, а затем использовать то же значение, что и в обеих таблицах, когда две таблицы имеют один к одному отношения.

То есть, создайте супертип или "главную" таблицу, которая содержит значение PK, которое будет необязательно один раз в каждой из двух других таблиц. Сделайте ключевой столбец двух таблиц обе КЛАСТЕРНЫМ ПК этой таблицы, а также FK для основной таблицы, а не для таблицы других подтипов.

Проблема решена. Таблицы могут иметь как ноль, так и одну строку каждого значения.

В конечном счете, если генерация PK не основана на идентичности, и в таблице супертипов, кроме значения PK, нет данных, которые хранятся в таблице, то фактически таблица супертипа на самом деле не нужна, за исключением случая окончательной записи, что логическая сущность существует (она находится в таблице супертипов), но имеет нулевые строки в обеих таблицах подтипов. Если отсутствия значения достаточно, чтобы надежно указать, что обе таблицы подтипов имеют нулевые строки, и значение PK для двух таблиц может быть сгенерировано без столбца идентификаторов, тогда таблица супертипа может быть удалена. На самом деле никакой FK между двумя таблицами не требуется, поскольку ни в одной из таблиц не должно быть строк, соответствующих текущей строке в другой таблице.

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