エンティティフレームワークとSQL Serverビュー

.net-3.5 entity-framework primary-key sql-server-2005 sql-view

質問

私が自由に話すことができないいくつかの理由から、Sql Server 2005データベースでビューを次のように定義しています。

CREATE VIEW [dbo].[MeterProvingStatisticsPoint]
AS
SELECT
    CAST(0 AS BIGINT) AS 'RowNumber',
    CAST(0 AS BIGINT) AS 'ProverTicketId',
    CAST(0 AS INT) AS 'ReportNumber',
    GETDATE() AS 'CompletedDateTime',
    CAST(1.1 AS float) AS 'MeterFactor',
    CAST(1.1 AS float) AS 'Density',
    CAST(1.1 AS float) AS 'FlowRate',
    CAST(1.1 AS float) AS 'Average',
    CAST(1.1 AS float) AS 'StandardDeviation',
    CAST(1.1 AS float) AS 'MeanPlus2XStandardDeviation',
    CAST(1.1 AS float) AS 'MeanMinus2XStandardDeviation'
WHERE 0 = 1

Entity Frameworkは、このクエリに基づいてエンティティを作成しますが、次のようなエラーでそれを生成します。

警告6002:テーブル/ビュー 'Keystone_Local.dbo.MeterProvingStatisticsPoint'には主キーが定義されていません。キーが推測され、定義は読み取り専用のテーブル/ビューとして作成されました。

そして、CompletedDateTimeフィールドがこのエンティティの主キーになることを決定します。

モデルの生成にはEdmGenを使用しています。エンティティフレームワークにこのビューのフィールドを主キーとして含めないようにする方法はありますか?

受け入れられた回答

私たちも同じ問題を抱えており、これが解決策です。

エンティティフレームワークに列を主キーとして使用させるには、ISNULLを使用します。

エンティティフレームワークに列を主キーとして使用しないように強制するには、NULLIFを使用します。

これを適用する簡単な方法はあなたのビューのselectステートメントを他のselectでラップすることです。

例:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

人気のある回答

私はデザイナーを使ってこれを解決することができました。

  1. モデルブラウザを開きます。
  2. ダイアグラムでビューを見つけます。
  3. 主キーを右クリックし、[エンティティキー]がオンになっていることを確認します。
  4. すべての非主キーを複数選択します。 CtrlキーまたはShiftキーを使用してください。
  5. [プロパティ]ウィンドウ(表示する必要がある場合はF4キーを押します)で、[エンティティキー]ドロップダウンをFalseに変更します。
  6. 変更内容を保存。
  7. Visual Studioを閉じて、もう一度開きます。私はEF 6でVisual Studio 2013を使用していますが、警告を消すにはこれを行う必要がありました。

ISNULL、NULLIF、またはCOALESCEの回避策を使用するようにビューを変更する必要はありませんでした。データベースからモデルを更新すると、警告が再表示されますが、VSを閉じて再度開くと警告は消えます。デザイナーで行った変更は保持され、更新による影響は受けません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ