entity framework - relaciones - No se puede agregar una vista al modelo de datos EF
relaciones entity framework (9)
Tengo una opinión de que estoy tratando de agregar a mi Modelo de Datos de Entidades 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 SP1
Actualización : Encontré este enlace pero el problema no se resolvió con estas soluciones. Foro de MSDN
Actualización: la vista que no puedo agregar consultará desde otra 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.شناسه
- Cree una tabla de soporte con un campo de clave principal e inserte solo un registro.
- crear vista con unirse a la columna (clave) creada de esa tabla.
- Ahora puede agregar la vista al Modelo de entidad.
Agregas el campo de la clave primaria en tu vista, la entidad es mala con él
Compruebe si su Vista es segura Ver en el archivo * .edmx.
Correcto:
<EntitySet Name="SomeView" EntityType="Model.SomeView" store:Type="Views" Schema="dbo" />
Incorrecto:
<EntitySet Name="SomeView" EntityType="Model.SomeView" store:Type="Tables" Schema="dbo" />
El 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 luego 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.
En mi caso fue por una OUTER JOIN.
Eso hace que las columnas sean nulos y que EF no pueda importarlas.
Cuando lo cambié a INNER JOIN funcionó.
Otra forma es usar ISNULL (ver la respuesta a esta publicación )
He experimentado este mismo comportamiento cuando trato de agregar una vista que no selecciona una clave primaria de otra tabla. (Como Ladislav Mrnka ha comentado)
Mi estrategia para resolver esto es reducir la vista 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.
Para poder agregar una vista a un modelo, Entity Framework necesita al menos una columna en la vista de la base de datos para que no sea nulable .
Puede agregar un recuento de filas a la vista y hacer que se vea como un campo clave "Id" que no es nulo. Un ejemplo:-
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]
Si su vista no contiene la columna de la clave principal, entonces no se agregará al archivo edmx.