Почему я не могу использовать представление, содержащее объединение в Entity Framework 4.0? - PullRequest
3 голосов
/ 27 июня 2011

У меня есть представление, которое выглядит примерно так:

SELECT Id, Name
FROM Users
UNION ALL
SELECT NULL as [Id], NULL as [Name]

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

Ответы [ 4 ]

15 голосов
/ 01 марта 2013

Я знаю, что это старый вопрос, уже помеченный как ответ, но я хотел опубликовать альтернативу редактированию 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 может быть отредактирован напрямую, как предложил Маркос Прието, но вы рискуете переписать эти изменения в следующий развы запускаете «Обновить модель из базы данных».

Надеюсь, это поможет любому, кто столкнется с этим в будущем!

2 голосов
/ 04 октября 2011

У меня был вид, который работал отлично.Я изменил его (изменил представление на объединение 2 таблиц), обновил модель из базы данных, и эта проблема появилась.

Я исправил ее в 3 этапа:

  1. Откройте.Файл edmx с редактором XML.
  2. Раскомментируйте код представления EntityType представления (edmx: StorageModels> Schema) и добавьте ключ:

    <EntityType Name="your_view">
       <Key>
          <PropertyRef Name="your_id" />
       </Key>
       <Property Name="your_id" Type="int" Nullable="false" />
       <Property Name="other_field" Type="varchar" MaxLength="45" />
    </EntityType>
    
  3. Beубедитесь, что EF не удалил представление в edmx: StorageModels> Schema> EntityContainer (если у вас есть хранилище кода, скопируйте код оттуда):

    <EntitySet Name="your_view" EntityType="Your_Model.Store.your_view" store:Type="Views" store:Schema="your_schema" store:Name="your_view">
        <DefiningQuery>SELECT
           `your_view`.`your_id`, 
           `your_view`.`other_field`, 
            FROM `your_view` AS `your_view`
        </DefiningQuery>
    </EntitySet>
    
2 голосов
/ 28 июня 2011

Это потому, что Visual Studio не может определить первичный ключ вашего представления.Вы можете увидеть сообщение об ошибке в файле edmx, открыв его в XML-редакторе и просмотрев раздел SSDL.Вот сообщение об ошибке, полученное в результате моей Модели (которую я создал для представления, похожую на вашу в моей Базе данных, просто для эмуляции):

Errors Found During Generation:
warning 6013: The table/view 'PhoneBook.dbo.ContactCustomer' does not have 
a primary key defined and no valid primary key could be inferred.
This table/view has been excluded. To use the entity, 
you will need to review your schema, 
add the correct keys, and uncomment it.

Это не правда, что Union не поддерживается в EF 4. Но я думаю,проблема в том, что Visual Studio воспринимал ваш вид как нечетный вид.

Вы можете провести эксперимент, создав другой вид и сравнив их (используя обновление модели из меню базы данных в конструкторе моделей).

И вы можете изменить модель вручную (вручную введя файл edmx), чтобы определить первичный ключ для решения этой проблемы.

0 голосов
/ 21 апреля 2016

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

...