Невозможно добавить представление в модель данных EF

У меня есть точка зрения, которую я пытаюсь добавить в свою модель данных сущности ADO.NET. Каждый раз, когда я пытаюсь выполнить обновление из базы данных и проверяю представление, оно обновляет все остальное, но не добавляет представление.
Я не получаю сообщения об ошибке или вывода, поэтому я понятия не имею, что не так с представлением. Другие взгляды не проблема. Я что-то упускаю, есть ли способ включить сообщения об ошибках? Visual Studio 2008 с пакетом обновления 1 (SP1)

Обновление: я нашел эту ссылку, но эти решения не помогли решить проблему. Форум MSDN

Обновление: представление, которое я не могу добавить, будет запрашивать из другого представления.

Обновление: справка

WITH cte AS (SELECT     dbo.TBL_Gharardad.PK_Shenase, dbo.TBL_Gharardad.FK_NoeKhedmat AS NoeKhedmatId, 
                                                    dbo.TBL_NoeKhedmat.NoeKhedmat AS [نوع خدمت], dbo.TBL_Gharardad.OnvaneKhedmat AS [عنوان خدمت], 
                                                    dbo.TBL_Gharardad.MahaleEraeieKhedmat AS [محل ارائه خدمت], 
                                                    dbo.TBL_Gharardad.FK_NahveieTaieeneBarande AS NahveieTaeeneBararndeId, 
                                                    dbo.TBL_NahveieTaieeneBarande.NahveieTaieeneBarande AS [نحوه تعيين برنده], 
                                                    dbo.TBL_Gharardad.TarikheShorooeGharardad_Jalali AS [تاريخ شروع قرارداد], 
                                                    dbo.TBL_Gharardad.TarikhePayaneGharardad_Jalali AS [تاريخ پايان قرارداد], dbo.TBL_Gharardad.FK_VahedeArz AS VahedeArzId, 
                                                    dbo.TBL_VahedeArz.VahedeArz AS [واحد ارز], dbo.TBL_Gharardad.MablagheDariaftiKol AS [مبلغ دريافتي کل], 
                                                    dbo.TBL_Gharardad.MablaghePardakhtieKol AS [مبلغ پرداختي کل], dbo.TBL_Gharardad.SahmeKarfarma AS [درصد مشارکت کارفرما], 
                                                    100 - dbo.TBL_Gharardad.SahmeKarfarma AS [درصد مشارکت پيمانکار], dbo.TBL_Gharardad.TedadNirooyeMard AS [تعداد نيروي مرد], 
                                                    dbo.TBL_Gharardad.TedadNirooyeZan AS [تعداد نيروي زن], 
                                                    dbo.TBL_Gharardad.TedadNirooyeMard + dbo.TBL_Gharardad.TedadNirooyeZan AS [تعداد کل نيروها], 
                                                    dbo.TBL_Gharardad.FK_TarafeGharardad AS TarafeGharardadId, 
                                                    CASE TBL_TarafeGharardad.Hoghooghi WHEN 0 THEN ISNULL(TBL_TarafeGharardad.Naam, ' ') 
                                                    + ' ' + ISNULL(TBL_TarafeGharardad.NaameKhanevadegi, ' ') ELSE TBL_TarafeGharardad.NameSherkat END AS [طرف قرارداد], 
                                                    dbo.TBL_Gharardad.FK_VahedeVagozarKonande AS VahedeVagozarKonandeId, 
                                                    dbo.TBL_VahedeVagozarKonande.VahedeVagozarKonande AS [واحد واگذار کننده], dbo.TBL_Gharardad.ShomareGharardad AS [شماره قرارداد], 
                                                    dbo.TBL_Gharardad.TarikheGharardad_Jalali AS [تاريخ قرارداد], 
                                                    CASE VaziateGharardad WHEN 0 THEN N'لغو شده' WHEN 1 THEN N'ثبت اوليه' WHEN 2 THEN N'فسخ' WHEN 3 THEN N'ثبت نهايي ' WHEN 4 THEN
                                                     N' جاري ' WHEN 5 THEN N'تمام شده ' WHEN 6 THEN N' متمم ' END AS [وضعيت قرارداد], dbo.TBL_NoeMoamele.NoeMoamele AS [نوع معامله]
                             FROM          dbo.TBL_Gharardad INNER JOIN
                                                    dbo.TBL_NoeKhedmat ON dbo.TBL_Gharardad.FK_NoeKhedmat = dbo.TBL_NoeKhedmat.PK_Id INNER JOIN
                                                    dbo.TBL_NahveieTaieeneBarande ON 
                                                    dbo.TBL_Gharardad.FK_NahveieTaieeneBarande = dbo.TBL_NahveieTaieeneBarande.PK_Id INNER JOIN
                                                    dbo.TBL_VahedeArz ON dbo.TBL_Gharardad.FK_VahedeArz = dbo.TBL_VahedeArz.PK_Id INNER JOIN
                                                    dbo.TBL_TarafeGharardad ON dbo.TBL_Gharardad.FK_TarafeGharardad = dbo.TBL_TarafeGharardad.PK_Id INNER JOIN
                                                    dbo.TBL_VahedeVagozarKonande ON 
                                                    dbo.TBL_Gharardad.FK_VahedeVagozarKonande = dbo.TBL_VahedeVagozarKonande.PK_Id INNER JOIN
                                                    dbo.TBL_NoeMoamele ON dbo.TBL_Gharardad.FK_NoeMoamele = dbo.TBL_NoeMoamele.PK_Id)
    SELECT     v_Gharardad.شناسه, v_Gharardad.NoeKhedmatId, v_Gharardad.[نوع خدمت], v_Gharardad.[عنوان خدمت], v_Gharardad.[محل ارائه خدمت], 
                            v_Gharardad.NahveieTaeeneBararndeId, v_Gharardad.[نحوه تعيين برنده], v_Gharardad.[تاريخ شروع قرارداد], v_Gharardad.[تاريخ پايان قرارداد], 
                            v_Gharardad.VahedeArzId, v_Gharardad.[واحد ارز], v_Gharardad.[مبلغ دريافتي کل], v_Gharardad.[مبلغ پرداختي کل], v_Gharardad.[درصد مشارکت کارفرما], 
                            v_Gharardad.[درصد مشارکت پيمانکار], v_Gharardad.[تعداد نيروي مرد], v_Gharardad.[تعداد نيروي زن], v_Gharardad.[تعداد کل نيروها], 
                            v_Gharardad.TarafeGharardadId, v_Gharardad.[طرف قرارداد], v_Gharardad.VahedeVagozarKonandeId, v_Gharardad.[واحد واگذار کننده], 
                            v_Gharardad.[شماره قرارداد], v_Gharardad.[تاريخ قرارداد], v_Gharardad.[وضعيت قرارداد], v_Gharardad.[نوع معامله]
     FROM         dbo.TBL_Gharardad AS TBL_Gharardad_3 INNER JOIN
                            dbo.v_GharardadRecords AS v_Gharardad ON v_Gharardad.شناسه = TBL_Gharardad_3.PK_Shenase
     WHERE     (TBL_Gharardad_3.FK_GharardadeAsli IS NULL) AND (TBL_Gharardad_3.PK_Shenase NOT IN
                                (SELECT     FK_GharardadeAsli
                                   FROM         dbo.TBL_Gharardad AS TBL_Gharardad_2
                                   WHERE     (FK_GharardadeAsli IS NOT NULL)))
UNION
SELECT     sub.FK_GharardadeAsli AS شناسه, cte_2.NoeKhedmatId, cte_2.[نوع خدمت], cte_2.[عنوان خدمت], cte_2.[محل ارائه خدمت], cte_2.NahveieTaeeneBararndeId, 
                      cte_2.[نحوه تعيين برنده], cte_2.[تاريخ شروع قرارداد], cte_2.[تاريخ پايان قرارداد], cte_2.VahedeArzId, cte_2.[واحد ارز], cte_2.[مبلغ دريافتي کل], cte_2.[مبلغ پرداختي کل], 
                      cte_2.[درصد مشارکت کارفرما], cte_2.[درصد مشارکت پيمانکار], cte_2.[تعداد نيروي مرد], cte_2.[تعداد نيروي زن], cte_2.[تعداد کل نيروها], cte_2.TarafeGharardadId, 
                      cte_2.[طرف قرارداد], cte_2.VahedeVagozarKonandeId, cte_2.[واحد واگذار کننده], cte_2.[شماره قرارداد], cte_2.[تاريخ قرارداد], cte_2.[وضعيت قرارداد], 
                      cte_2.[نوع معامله]
FROM         dbo.v_GharardadRecords AS cte_2 INNER JOIN
                          (SELECT     FK_GharardadeAsli, MAX(PK_Shenase) AS PK_Shenase, MAX(TarikheSabt) AS TarikheSabt
                             FROM         dbo.TBL_Gharardad AS TBL_Gharardad_1
                             WHERE     (FK_GharardadeAsli IS NOT NULL)
                             GROUP BY FK_GharardadeAsli) AS sub ON sub.PK_Shenase = cte_2.شناسه

person Saleh    schedule 17.05.2011    source источник
comment
Если какой-либо элемент не добавлен в модель, должно быть какое-то информационное сообщение. Есть ли в вашем представлении какой-либо столбец, не допускающий значения NULL? В противном случае EF не сможет его добавить.   -  person Ladislav Mrnka    schedule 17.05.2011
comment
Представление, которое я не могу добавить, будет запрашивать из другого представления.   -  person Saleh    schedule 17.05.2011
comment
Но все же EF должен вывести первичный ключ. Если EF не выводит первичный ключ, он пропускает объект базы данных. Откройте свой EDMX как XML и проверьте, находится ли представление в первой части XML (SSDL).   -  person Ladislav Mrnka    schedule 17.05.2011
comment
другое: на мой взгляд, я использовал CTE   -  person Saleh    schedule 17.05.2011
comment
CTE не должно быть проблемой, я уже использовал его, и он работал. Вы можете показать SQL представления?   -  person Ladislav Mrnka    schedule 17.05.2011
comment
извините, он содержит некоторые слова с моего языка. :): D   -  person Saleh    schedule 17.05.2011
comment
PK_ означает, что поле является первичным ключом, а FK_ означает, что поле является внешним ключом.   -  person Saleh    schedule 17.05.2011


Ответы (14)


Я испытал такое же поведение, когда пытался добавить представление, которое не выбирает первичный ключ из другой таблицы. (Как прокомментировал Ладислав Мрнка)

Моя стратегия решения этой проблемы - уменьшить представление до как можно более простого (1 столбец) и попытаться добавить его. После того, как вы добавили его в модель, медленно вводите больше столбцов и обновляйте модель, чтобы убедиться, что представление все еще существует. Обычно вы можете определить, в какой части представления возникают проблемы с EDM.

person Aducci    schedule 17.05.2011
comment
Вы можете обнаружить, что предпочтительным решением может быть передача одного из столбцов представления ключевой проверке соответствия EF. См. здесь - person Veverke; 23.08.2015
comment
Иногда я обнаружил, что группировка является проблемой (кажется немного случайной). Чтобы обойти это, я сначала создаю представление, выбирая ПК и другие поля, которые мне нужны. Затем привожу его в модель edmx. Как только я получил это, я вернулся к своему представлению и добавил группировку. Если вы не группируете ПК и это строго uid, я выбираю MAX (PK), чтобы требование идентификатора было выполнено. - person gregnnylf94; 17.05.2019

Если ваше представление не содержит столбца первичного ключа, оно не будет добавлено в файл edmx.

person Vinay    schedule 21.01.2013
comment
Также ключ не должен допускать значения NULL. Компилятор edmx продолжал давать сбой при обновлении, пока я не удалил и не импортировал представление. - person Brent; 17.02.2016
comment
Если у представления нет ключа, то поддельный: ВЫБРАТЬ ISNULL (ROW_NUMBER () OVER (ORDER BY MyColumn), 0) AS UniqueId ... - person Brent; 17.02.2016
comment
Вы можете объяснить, почему это необходимо EF для создания модели? Мне интересно узнать, почему это так работает. - person jtate; 06.07.2017

Здесь та же проблема, я добавил PrimaryKey в представление, используя:

..... (SELECT      TOP (100) PERCENT ROW_NUMBER() OVER (ORDER BY R.Road DESC) AS RoadNumber......

А потом мне пришлось сделать АСТ этого:

ISNULL (CAST(RoadNumber AS INT),0)AS RoadNumber

Столбец должен быть (не нулевым), поэтому CAST в конце.

person Ruben D. Lopez    schedule 28.10.2015
comment
Ваш ответ помог мне решить проблему. В основном все поля в моем представлении отображались как допускающие значение NULL, поэтому я просто использовал ваше предложение ISNULL, чтобы Entity Framework увидела некоторые столбцы, не допускающие значения NULL, и выбрала их для ключа. После этого я без проблем смог добавить вид. - person Yves A Martin; 21.01.2016
comment
Таким образом, мы получаем следующее: ISNULL (CAST (ROW_NUMBER () OVER (ORDER BY reportno ASC) AS INT), 0) AS Id - person rothschild86; 13.04.2017

В моем случае это произошло из-за ВНЕШНЕГО СОЕДИНЕНИЯ.
Это приводит к тому, что столбцы допускают значение NULL и не могут быть импортированы EF.

Когда я изменил его на INNER JOIN, это сработало.

Другой способ - использовать ISNULL (см. Ответ на этот пост)

person Aximili    schedule 19.11.2012
comment
Это было для меня, спасибо, Аксимили спас мою канадскую спину бекон - person J King; 15.09.2014

Чтобы иметь возможность добавить представление в модель, Entity Framework необходимо, чтобы хотя бы один столбец в представлении базы данных был не допускающим значения NULL.

person Tomas Chabada    schedule 28.01.2016

Убедитесь, что ваш View точно Просмотр в файле * .edmx.

Правильный:

<EntitySet Name="SomeView" EntityType="Model.SomeView" store:Type="Views" Schema="dbo" />

Неправильный:

<EntitySet Name="SomeView" EntityType="Model.SomeView" store:Type="Tables" Schema="dbo" />
person Mateusz Rostański    schedule 15.05.2015

Вы можете добавить количество строк в представление и сделать его похожим на ключевое поле «Id», которое не равно нулю. Пример:-

SELECT DISTINCT
     -- dumb key for EF in C#
     IsNull(cast(ROW_NUMBER() OVER(PARTITION BY [Notes] ORDER BY [Notes] ASC) as int), 0) as [Id]

     -- required fields
    ,[Notes]        as [Notes]
    ,Count([Notes]) as [NoteCount]
FROM
    [dbo].[Communication]
GROUP BY
    [Notes]
person pixelda    schedule 07.06.2018

Вы добавляете поле вместо первичного ключа в вашем представлении, сущность с ним плохой мальчик

person Héctor de León    schedule 24.10.2014

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

isnull([column], 0)
person mrkstrgn    schedule 27.03.2020

Это может быть комбинация ответов по этой теме, но все, что я прочитал, похоже, не упоминает это конкретное исправление. Мое представление объединяет три таблицы, и я получал упомянутые ошибки. Я выбрал ПК из двух таблиц, но не из третьей. После включения ПК из третьей таблицы структура сущности была удовлетворена.

person Gary Huckabone    schedule 08.04.2020

Добавьте id столбец в ваше представление:

isnull(ROW_NUMBER() OVER (PARTITION BY e.CCT ORDER BY e.CCT), 0) AS Id

После этого вы можете добавить свое представление в модель сущности.

person Susacande López Girón    schedule 07.04.2021

Добавьте фиктивное поле с идентификатором псевдонима, который не равен нулю

...fields, 1 as id
person Onur Bassist    schedule 12.06.2021

Просто было это, и больше ничего не работало. У меня это было несколько раз, и трюк с идентификатором первичного ключа сработал. Не в этот раз. В отчаянии я переписал их как сохраненные процессы, и ВСЕ ЕЩЕ не появлялись!

Причина в том, что onedrive синхронизирует папку sln между двумя машинами. Я удалил папки .vs, bin и obj и перекомпилировал, и, наконец, это сработало.

person SteveCav    schedule 26.04.2021
comment
Но это не то, что специально вызывает и решает эту проблему. Это может вызвать столько проблем, что вы можете добавить его в качестве ответа почти куда угодно. - person Gert Arnold; 26.04.2021
comment
Да, но если это поможет кому-то еще сэкономить волосы, я приму удар против. - person SteveCav; 08.06.2021
comment
Да ладно, есть шанс один на миллиард, что у кого-то такая же ошибка по той же причине. Это означает, что практически для всех это просто шум, еще один ответ, который нужно читать напрасно. В этом вопросе уже достаточно шума. - person Gert Arnold; 08.06.2021

  1. Создайте вспомогательную таблицу с полем первичного ключа и вставьте только одну запись.
  2. создать представление с присоединением к созданному столбцу (ключу) этой таблицы.
  3. Теперь вы можете добавить представление в модель сущности.
person user8544837    schedule 31.08.2017
comment
GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo]. [CUSTOM_DUAL] ([ID] [int] NOT NULL, CONSTRAINT [PK_TBL_CUSTOM_DUAL] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (PAD_INDEXICS = OFF), , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] GO - person user8544837; 31.08.2017
comment
Можете ли вы просто отредактировать свой ответ, чтобы включить все? - person Giulio Caccin; 31.08.2017