Отношения 1 к 1 - PullRequest
       6

Отношения 1 к 1

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

Рабочий может иметь только одно транспортное средство, и Транспортное средство может принадлежать только одному рабочему за один раз.Я знаю 3 возможных реализации:
1.

Vehicle(Id, Number)
Worker(Id, Name, VehicleId)
--> This allows two workers have the same vehicle.

2.

Worker(Id, Name)
Vehicle(Id, Number, WorkerId)
--> This allows worker to have two vehicles.

3.

   Worker(Id, Name)
   Vehicle(Id, Number)
   WorkersVehicles(Id, VehicleId, WorkerId)
    --> This allows each worker to have many vehicles and each vehicle to belong to many workers.

Ни одно из вышеперечисленных не может описатьжелаемое соотношение 1: 1.

Как я могу описать это соотношение 1: 1 в БД и в Entity Framework?

Ответы [ 4 ]

3 голосов
/ 26 июня 2011

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

Хотя обойти это можно с помощью хитрости (удаление ограничений, использование специфичных для СУБД команд, таких как отложенные ограничения Oracle), это невозможно сделать в традиционном смысле.Самое близкое, что вы можете получить, это 1:0..1.

. Ниже приведены модели, представляющие различные комбинации Worker:Vehicle:

0..1:1

Worker (ID, VehicleID unique constraint)
Vehicle (ID)

1:0..1

Worker (ID)
Vehicle (ID, WorkerID unique constraint)

0..1:0..1

Worker (ID)
Vehicle (ID)
WorkerVehicle (WorkerID, VehicleID) <-- primary key on one column, 
                                        unique constraint on the other

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

1 голос
/ 26 июня 2011

Как описал @Adam, вам нужно сделать FK уникальным, чтобы обеспечить взаимно-однозначное отношение, и потому что EF не поддерживает уникальные ограничения, но единственный способ сделать это в EF:

Worker(ID)
Vehicle(ID) <-- PK and FK to worker

Размещение FK для PK обеспечит уникальность. Обходной путь использует:

Worker(ID)
Vehicle(ID, WorkerID) <-- WorkerID is FK with unique constraint in the database

После сопоставления с EDMX вы удалите Vehicles свойство навигации из Worker. Если вы назначите одно транспортное средство двум работникам базы данных, будет выдано исключение. Недостатком этого обходного пути является то, что у вас нет доступа к транспортному средству от работника (у вас нет свойства навигации).

В любом случае отношение один-к-одному встречается редко - его следует в основном использовать для сценария «есть», а для сценария «есть» реже. В некоторых случаях я думаю, что разумно использовать один-ко-многим вместо одного-к-одному и управлять проверкой в ​​логике приложения. Если в будущем требования изменятся, добавление новой связанной сущности в принципал будет делом изменения проверки, а не изменения половины приложения. Вы можете решить, может ли это быть вашим случаем.

1 голос
/ 26 июня 2011

Возможно, вам потребуется использовать уникальное ограничение , в котором говорится, что у сотрудников должен быть уникальный VehicleId

. Казалось бы, EF напрямую не поддерживает уникальные ограничения в соответствии с этой публикацией SO Как добавить ограничения в объект ADO.NET?

0 голосов
/ 26 июня 2011

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

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