Можно ли создать связь между двумя обычными полями в Entity Framework, игнорируя тем самым первичный ключ? - PullRequest
5 голосов
/ 27 августа 2010

У меня есть следующая ситуация между этими тремя таблицами:

alt text

Прежде чем я начну объяснять, что я пытаюсь сделать здесь, позвольте мне прояснить три вещи:

  1. Я нарисовал модель на EntityFramework, но на самом деле это представление базы данных. Просто предположим, что тип полей совпадает между таблицами;

  2. Я знаю, что эта модель базы данных отстой. Но об изменении этого вопроса не может быть и речи. Я знаю, что это облегчит мою жизнь.

  3. Я использую Visual Studio 2008 и .Net 3.5 для этого проекта. Но я также принимаю решения на основе Visual Studio 2010 и .Net 4.0.

Итак, как я пытался продемонстрировать на картинке выше, в этом проекте, над которым я работаю, я получил эти 3 таблицы. Один из них, TransactionLine , связывает файл со строкой транзакции, которая является частью полной транзакции.

Теперь я пытаюсь связать здесь TransactionLine и File . Однако TransactionLine не имеет поля FileId из таблицы File . Поля FileNumber и FileType из этой таблицы обозначают составной ключ для File . И действительно, File FileNumber и FileType никогда не повторяются. Они могут быть первичным ключом, но опять же, я не могу коснуться структуры базы данных.

Я пытаюсь связать TransactionLine и Файл путем создания Ассоциации От одного ко многим из Файл в TransactionLine . После этого я выбираю Ассоциация и переключаюсь на экран Сведения о сопоставлении , затем выбираю Карты на TransactionLine .

Данные, которые он просит заполнить на экране модели:

  • Файл 1077 * FILEID ;.
  • TransactionLine 1083 * TransactionID ;.
  • TransactionLine 1089 * Номер_файла ;.
  • TransactionLine . FileType

Все скалярные свойства TransactionLine задаются соответствующими им полями базы данных, которые имеют одно и то же имя. Но когда я собираюсь указать связь с таблицей File , единственное скалярное поле, которое я могу указать, это FileId , которого у меня нет на TransactionLine Таблица.

Я также пытался установить File s FileNumber и FileType флаг ключа сущности скалярных свойств в значение true и FileId флаг сущности в false, но безуспешно, так как программа предупреждает меня, что база данных FileId является первичным ключом, но не установлена ​​как единица на сущности.

Можно ли связать TransactionLine FileNumber и FileType с File ? Есть ли обходной путь для этой ситуации?

Специальное примечание: FileId действительно является первичным ключом для File . Другие таблицы связаны с этим полем. TransactionLine здесь является исключением из правила здравого смысла. (

1 Ответ

2 голосов
/ 30 августа 2010

Мы достигли цели: D.

Благодаря Dr. Ученик Вилли за подсказку о решении.

Вот что мы сделали:

alt text

  1. Мы создали представление с именем VIEWFILEEXTRA, содержащее только те поля, которые мы хотели бы использовать в ассоциации;

  2. После этого мы создали объект, основанный на этом представлении, с именем FileExtra;

  3. Отобразить FileExtra на VIEWFILEEXTRA, если это еще не сделано;

  4. Измените FileNumber и FileType из флага ключа объекта FileExtra на true;

  5. Удалить скалярные свойства FileNumber и FileType из File;

  6. Создание связи 1 на 1 между файлом и FileExtra;

  7. Установите скалярные свойства в сопоставлении ассоциации так, чтобы они указывали на поля базы данных File FileNumber и FileType;

  8. Создание связи «1 ко многим» между FileExtra и TransactionLine;

  9. Укажите сопоставление ассоциации на TransactionLine и установите поля.

И это все. Большое спасибо за внимание и советы: D.

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