由於幾個我無權談論的原因,我們在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

我們的想法是,實體框架將基於此查詢創建一個實體,但它會生成一個包含以下內容的錯誤:

警告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. 右鍵單擊主鍵,確保選中“Entity Key”。
  4. 多選所有非主鍵。使用Ctrl或Shift鍵。
  5. 在“屬性”窗口中(如果需要,請按F4查看),將“實體鍵”下拉列表更改為False。
  6. 保存更改。
  7. 關閉Visual Studio並重新打開它。我正在使用帶有EF 6的Visual Studio 2013,我必須這樣做才能讓警告消失。

我沒有必要更改我的視圖以使用ISNULL,NULLIF或COALESCE解決方法。如果您從數據庫更新模型,警告將重新出現,但如果您關閉並重新打開VS,它將會消失。您在設計器中所做的更改將被保留,並且不會受到刷新的影響。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因