2011-05-17 52 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