Я знаю, что это старый вопрос, уже помеченный как ответ, но я хотел опубликовать альтернативу редактированию edmx.Я усвоил этот трудный путь, после множества поисков в Google и потягивания волос в течение нескольких часов, пробуя разные варианты ...
Для представления, EF пытается вывести первичный ключ, идентифицируя столбцы, которыене обнуляемый и недвоичный (см. Создание ключа сущности, если не указан ключ ).
С представлением, используемым для сглаживания связанных данных для целей поиска, это может привести к появлению множества столбцов(или неправильные) выводятся как ключи.
Для представления с UNION это может вызвать противоположную проблему, поскольку может не быть столбца истинной идентификации, который можно было бы безопасно включить в качестве ключа.
Чтобы заставить EF идентифицировать столбцы как ключ, вы можете использовать ISNULL (), чтобы убедиться, что значение не может иметь значение NULL: ISNULL(column_name, replacement_value)
Чтобы заставить EF не отмечать столбец как ключ,Вы можете использовать NULLIF (), чтобы сделать его обнуляемым: NULLIF(column_name, value_not_equal_to_parameter_1)
Если вам нужно убедиться, что значение возвращено, но вы не хотите, чтобы оно было помечено как ключ, я думаю, что COALESCE(column_name, replacement_value)
подойдетработа ISNULL без маркировки EFстолбец как ключ
Если действительно нет доступного жизнеспособного столбца в качестве первичного ключа (как в представлении UNION), вы можете подделать ненулевой PK с помощью ISNULL() в сочетании с ROW_NUMBER () в вашем операторе SELECT: SELECT ISNULL(ROW_NUMBER() OVER (ORDER BY sort_criteria), 0) as 'ALIASNAME'
В качестве альтернативы, edmx может быть отредактирован напрямую, как предложил Маркос Прието, но вы рискуете переписать эти изменения в следующий развы запускаете «Обновить модель из базы данных».
Надеюсь, это поможет любому, кто столкнется с этим в будущем!