Поддержка Entity Framework для старой базы данных, которая использует -1, чтобы указать отсутствие связи? - PullRequest
1 голос
/ 19 мая 2011

У меня есть база данных, как в следующем примере:

Клиент

CustomerID int
Название ...

Документ

DocumentID int
CustomerID int
DocumentDate ...

Вот в чем дело. Не все документы относятся к клиенту. Проблема в том, что эта старая база данных не использует int NULL для Document-> CustomerID. Вместо этого это int не обнуляемый тип, и он использует сохраненное значение -1, чтобы указать, что у него нет клиента. Код, который выполняется поверх этой базы данных, знает, что -1 является особенным, и указывает на отсутствие связанной сущности.

Моя проблема в том, что теперь я хочу построить модель сущности поверх нее. Есть ли способ сообщить Entity Model, что -1 в поле CustomerID таблицы Document означает, что нет никакой связи? Entity Framework должен был бы сопоставить int на уровне базы данных с обнуляемым int на уровне модели, и всякий раз, когда он извлекал запись из базы данных, ему приходилось отображать значение -1 на ноль, и всякий раз, когда он сохранялся, сохранить ноль как -1. И при заполнении наборов сущностей это отображение также должно учитываться.

Имеет ли это смысл? Кажется, что-то, что Entity Framework мог бы встроить где-нибудь под одеяло, но опять же, может быть, и нет.

Идеи

1 Ответ

0 голосов
/ 20 мая 2011

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

EF будет обрабатывать это как любое другое отношение.Вам придется обмануть EF, установив FK на -1 или свойство навигации на new Customer { Id = -1 }, и вы должны будете убедиться, что для этого фиктивного объекта всегда установлено состояние Не изменено, вызвав context.ObjectStateManager.ChangeObjectState.В противном случае EF попытается создать или изменить эту сущность при сохранении Document.

Отдельной проблемой может быть отложенная загрузка \ полная загрузка.Я действительно не уверен, как EF будет обрабатывать ситуацию, когда FK содержит Id несуществующего объекта.Я почему-то боюсь, что как ленивая, так и энергичная загрузка приведут к исключению.

Самый простой способ справиться с этими проблемами - создать специальный NullCustomer в вашей базе данных с Id -1, чтобы вы использовали связь среальная запись базы данных.

EF не поддерживает ваш сценарий.

...