2011-05-17 87 views
29

我有一種觀點,我試圖添加到我的ADO.NET實體數據模型中。每次我嘗試從數據庫更新並檢查視圖時,它都會刷新其他所有內容,但不會添加視圖。我沒有收到任何錯誤信息或輸出,所以我不知道視圖有什麼問題。其他視圖沒有問題。我錯過了一些東西,有沒有辦法打開錯誤信息? visual studio 2008 sp1無法將視圖添加到EF數據模型中

更新:我發現這個鏈接,但問題沒有解決這些解決方案。 MSDN Forum

更新:我不能添加它會從另一個視圖查詢視圖。

更新:幫助

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.شناسه 
+2

如果有任何項目沒有添加到模型中,應該有一些信息消息。您的視圖中是否有任何不可空列?如果不是,EF將不能添加它。 – 2011-05-17 10:30:04

+0

我無法添加的視圖將從另一個視圖進行查詢。 – Saleh 2011-05-17 11:58:01

+2

但是EF仍然必須推斷主鍵。如果EF不推斷主鍵,它將跳過數據庫對象。將您的EDMX打開爲XML並檢查視圖是否位於XML(SSDL)的第一部分。 – 2011-05-17 12:01:56

回答

12

當我嘗試添加不選擇從另一個表的主鍵的視圖我已經經歷過這種相同的行爲。 (像Ladislav Mrnka評論過的)

我的解決方法是儘可能簡化視圖(1列)並嘗試添加它。一旦將它添加到模型中,請慢慢地引入更多列並刷新模型以確保視圖仍然存在。您通常可以確定視圖的哪一部分正在給出EDM問題。

+1

您可能會發現,使其中一個視圖列通過EF的關鍵資格檢查可能是首選解決方案。請參閱[這裏](http://stackoverflow.com/a/2715299/1219280) – Veverke 2015-08-23 14:37:23

5

在我的情況下,這是因爲一個外部連接。
這會導致列可以爲空並且不能由EF導入。

當我將其更改爲INNER JOIN時,它工作正常。

另一種方法是使用ISNULL(見答案this post

+1

這是對我來說,謝謝aximili拯救了我的加拿大後退培根 – 2014-09-15 02:49:34

25

如果您認爲不包含主鍵列,那麼它不會添加到EDMX文件。

+1

也關鍵必須是不可空的。編譯器edmx保持更新失敗,直到我刪除並重新導入視圖。 – Brent 2016-02-17 16:14:47

+3

如果視圖沒有一個鍵,那麼假的一個:SELECT ISNULL(ROW_NUMBER()OVER(ORDER BY MyColumn),0)AS UniqueId ... – Brent 2016-02-17 19:09:41

+0

你能解釋爲什麼這是EF生成模型所必需的嗎?我很想知道它爲什麼這樣工作。 – jtate 2017-07-06 14:49:59

0

你在你的視圖中添加主鍵字段,實體是男孩它

0

檢查壞的,如果你的視圖是在* .edmx文件確定視圖。

正確:

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

錯誤:

<EntitySet Name="SomeView" EntityType="Model.SomeView" store:Type="Tables" Schema="dbo" /> 
11
這裏

同樣的問題,我所做的就是添加的PrimaryKey的查看,使用:

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

然後我必須做一個這樣的CAST:

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

該列必須是(非空),這就是CAST在最後的原因。

+0

您的回答幫助我解決了這個問題。基本上我的視圖中的所有字段都顯示爲空,所以我只是使用了ISNULL建議,因此實體框架會看到一些不可空列,併爲密鑰選擇這些列。之後,我能夠添加視圖沒有問題。 – 2016-01-21 01:35:24

+0

所以結合起來,我們得到這樣的:ISNULL(CAST(ROW_NUMBER()OVER(ORDER BY reportno ASC)AS INT),0)爲ID – rothschild86 2017-04-13 20:00:15

2

爲了能夠將視圖添加到模型中,實體框架需要在數據庫視圖中至少有一列爲不可爲空

-2
  1. 使用主鍵字段創建支持表並僅插入一條記錄。
  2. 使用連接到該表的創建列(鍵)創建視圖。
  3. 現在您可以將視圖添加到實體模型。
+0

GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [DBO]。[CUSTOM_DUAL]( \t [ID] [INT] NOT NULL, 約束[PK_TBL_CUSTOM_DUAL] PRIMARY KEY CLUSTERED ( \t [ID] ASC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] )ON [PRIMARY] GO – user8544837 2017-08-31 18:16:08

+0

你能編輯你的答案嗎? – 2017-08-31 18:39:41