EF4: Создание ассоциации 0..1 ко многим - PullRequest
0 голосов
/ 30 апреля 2011

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

Import
Primary Key:
   Number : Int32
   Date : DateTime

Hour
Primary Key:
   DepartmentID : Int32
   UserNumber : Int32
   Date : DateTime

Ассоциация называется ImportHour. Import.Number сопоставляется с Hour.UserNumber, а Import.Date сопоставляется с Hour.Date. Я пытаюсь добавить ассоциацию, которая равна 0..1 при импорте, и * по часу со свойствами навигации и без дополнительных внешних ключей. Когда я делаю это, дизайнер говорит мне, что связь не отображается. Если я затем генерирую DDL, он создает новые поля Hours.Import_Date и Hours.Import_Number (Hours - это фактическое имя таблицы базы данных для сущности Hour). Если я вручную сопоставлю поля, я получаю следующую ошибку:

Error 3021: Problem in mapping fragments starting at line 332:
Each of the following columns in table Hours is mapped to multiple conceptual side properties:
Hours.Date is mapped to <ImportHour.Hour.Date, ImportHour.Import.Date>
Hours.UserNumber is mapped to <ImportHour.Hour.UserNumber, ImportHour.Import.Number>*

Я не совсем уверен, что происходит, и не думаю, что достаточно хорошо понимаю процесс «картографирования», чтобы понять это. Похоже, что он хочет получить пятикратный ключ вместо того, чтобы понять, что один ключ сопоставляется с другим. Я смотрю на другие ассоциации «один ко многим», и у них даже нет сопоставлений таблиц; Я думаю, что они вместо этого имеют ссылочные ограничения, но вы, очевидно, не можете иметь ссылочные ограничения с ассоциацией 0..1 ко многим.

Ответы [ 3 ]

1 голос
/ 30 апреля 2011

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

Вы не можете иметь 0..1 на Import, потому что в этом случае UserNumber и Date в Hour должны быть обнуляемыми.Вот что означает это отношение.Если основной сущности не существует (Import), свойства FK в зависимой сущности (Hour) будут нулевыми.

Кстати.использование DateTime в первичном ключе не рекомендуется .

0 голосов
/ 05 июля 2013

@ Sahuagin, это может быть задолго после вашего вопроса, но вы пытались после добавления ассоциации удалить скалярное свойство в конструкторе - например, после создания ассоциации ImportHour удалите hour.usernumber и hour.date из вашей часовой сущности,таким образом, независимая ассоциация, установленная таким образом, является единственной связью между вашими сущностями - в этом смысл независимой ассоциации

0 голосов
/ 10 октября 2011

Насколько я могу судить по другим базам данных, которые я использовал с тех пор, проблема здесь заключается в том, что модель EF требует, чтобы внешний ключ уже существовал в базе данных. Хотя я не могу заставить EF сгенерировать его, он примет его, если он уже существует. (Вопреки тому, что я сказал в этом вопросе, вы можете иметь референтное ограничение на внешний ключ от 0 до 1 (обнуляемый)).

...