ADO.NETエンティティデータモデルに追加しようとしているとの見解があります。データベースから更新してビューを確認しようとするたびに、他のすべてが更新されますが、ビューは追加されません。
エラーメッセージも出力もないので、ビューの何が問題なのかわかりません。他のビューは問題ありません。何か不足していますか?エラーメッセージをオンにする方法はありますか? Visual Studio 2008 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.شناسه
別のテーブルから主キーを選択しないビューを追加しようとすると、これと同じ動作が発生しました。 (Ladislav Mrnkaがコメントしたように)
これを解決するための私の戦略は、ビューを可能な限りシンプル(1列)に減らし、追加してみることです。モデルに追加したら、ゆっくりと列を追加し、モデルを更新して、ビューがまだそこにあることを確認します。通常、ビューのどのセクションがEDMの問題を引き起こしているかを特定できます。
ビューに主キー列が含まれていない場合は、edmxファイルに追加されません。
ここで同じ問題、私がやったことは、ビューにPrimaryKeyを追加することでした:
..... (SELECT TOP (100) PERCENT ROW_NUMBER() OVER (ORDER BY R.Road DESC) AS RoadNumber......
そして、私はこれのキャストをしなければなりませんでした:
ISNULL (CAST(RoadNumber AS INT),0)AS RoadNumber
列は(nullではない)である必要があります。そのため、最後にCASTを使用します。
私の場合、それはOUTER JOINによるものでした。
これにより、列がnull可能になり、EFでインポートできなくなります。
それをINNER JOINに変更するとうまくいきました。
別の方法は、ISNULLを使用することです( この投稿 への回答を参照してください)
Entity Frameworkは、ビューをモデルに追加できるようにするために、データベースビューの少なくとも1つの列をnull不可にする必要があります。
ビューに行カウントを追加して、それをnullではないキー「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]
ビューが* .edmxファイルで確実に表示されているかどうかを確認します。
正しい:
<EntitySet Name="SomeView" EntityType="Model.SomeView" store:Type="Views" Schema="dbo" />
違う:
<EntitySet Name="SomeView" EntityType="Model.SomeView" store:Type="Tables" Schema="dbo" />
Null許容列が1つあるビューを読み込もうとしました。これに対する私の解決策は、null許容列をisnullでラップし、デフォルトのゼロを提供することでした。
isnull([column], 0)
ビューに主キーよりもフィールドを追加すると、エンティティはそのフィールドの不良です