2011-05-17 11 views
29

Tengo una vista que estoy tratando de agregar a mi modelo de datos de entidad ADO.NET. Cada vez que intento actualizar desde la base de datos y verifico la vista, actualiza todo lo demás, pero no agrega la vista. No aparece ningún mensaje de error o salida, así que no tengo idea de qué está mal con la vista. Otras vistas no son un problema. ¿Me falta algo? ¿Hay alguna forma de activar los mensajes de error? Visual Studio 2008 SP1No se puede agregar una vista al modelo de datos EF

actualización: He encontrado este enlace, pero el problema no resuelto con estas soluciones. MSDN Forum

Actualización: La opinión de que no puedo añadir se consulta desde otro punto de vista.

Actualización: Ayuda

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

Debe haber algún mensaje de información si algún elemento no se agrega al modelo. ¿Hay alguna columna no anulable en su vista? Si no, EF no podrá agregarlo. –

+0

La vista que no puedo agregar consultará desde otra vista. – Saleh

+2

Pero aún así EF debe inferir clave primaria. Si EF no infiere la clave principal, omitirá el objeto de la base de datos. Abra su EDMX como XML y verifique si la vista se encuentra en la primera parte de XML (SSDL). –

Respuesta

12

he experimentado este mismo comportamiento cuando trato de añadir una vista de que no se seleccione una clave principal de otra tabla. (Como Ladislav Mrnka ha comentado)

Mi estrategia para resolver esto es reducir la vista a lo más simple posible (1 columna) y tratar de que se agregue. Una vez que lo haya agregado al modelo, agregue lentamente más columnas y actualice el modelo para asegurarse de que la vista aún esté allí. Por lo general, puede identificar qué sección de la vista está causando problemas de EDM.

+1

Es posible que una de las columnas de vista pase la verificación de elegibilidad de clave de EF podría ser una solución preferida. Ver [aquí] (http://stackoverflow.com/a/2715299/1219280) – Veverke

5

En mi caso fue por una UNIÓN EXTERIOR.
Esto hace que las columnas sean nulos y que EF no pueda importarlas.

Cuando lo cambié a INNER JOIN funcionó.

Otra forma es utilizar ISNULL (véase la respuesta a this post)

+1

esto fue todo para mí, gracias a Aximili guardé mi tocino trasero canadiense –

25

Si su vista no contiene la columna de clave principal, entonces no lo puedo añadir a EDMX archivo.

+1

También la clave no debe contener nulos. El compilador edmx siguió fallando en la actualización hasta que eliminé y volví a importar la vista. – Brent

+3

Si la vista no tiene una clave, falsifique una: SELECCIONE ISNULL (ROW_NUMBER() OVER (ORDER BY MyColumn), 0) AS UniqueId ... – Brent

+0

¿Puede explicar por qué es necesario que EF genere un modelo? Me interesa saber por qué funciona de esta manera. – jtate

0

agrega el campo de clave principal en su opinión, entidad es chico malo con ella

0

Compruebe si su vista es segura Ver en el archivo * .edmx.

correcta:

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

incorrecto:

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

mismo problema aquí, lo que hice fue agregar PrimaryKey en la vista, usando:

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

Y entonces Tuve que hacer un REPARTO de esto:

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

La columna debe ser (no nula), es por eso que el CAST al final.

+0

Tu respuesta me ayudó a resolver el problema. Básicamente, todos los campos, en mi opinión, se mostraban como anulables, así que acabo de utilizar su sugerencia ISNULL para que Entity Framework vea algunas columnas que no aceptan nulos y las elija para la clave. Después de eso, pude agregar la vista sin problemas. –

+0

Así combinada, obtenemos lo siguiente: ISNULL (CAST (ROW_NUMBER() OVER (ORDER BY reportno ASC) como INT), 0) como identificador de – rothschild86

2

Para poder agregar una vista a un modelo, Entity Framework necesita al menos una columna en la vista de la base de datos para ser no anulable.

-2
  1. Cree una tabla de soporte con un campo de clave principal e inserte solo un registro.
  2. crear vista con unir a la columna creada (clave) de esa tabla.
  3. Ahora puede agregar la vista al Modelo de entidad.
+0

GO ANSI_NULLS EN GO QUOTED SET EN GO CREATE TABLE [dbo]. [CUSTOM_DUAL] ( \t [ID] [int] NOT NULL, CONSTRAINT [PK_TBL_CUSTOM_DUAL] KEY principal agrupada ( \t [ID] ASC ) con (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = DESACTIVADO, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) EN [PRIMARIO] ) ENCENDIDO [PRIMARIO] GO – user8544837

+0

¿Puedes simplemente editar tu respuesta para incluir todo? –

Cuestiones relacionadas