2011-06-06 61 views
24

嘗試將視圖添加到edmx文件時,什麼都不會發生。
我打開使用WXL編輯器EDMX文件,我發現了以下錯誤:無法將視圖添加到edmx

​​

(importent的事情 - 我沒有,並且不需要添加該視圖基於對EDMX表。此外,該視圖僅用於對數據執行select語句)

因此,在db中,我更新了T_LINK表,並將反映在視圖上的一個字段作爲主鍵。然後,當我再次嘗試將視圖添加到edmx時,再次發生任何事情。

我該如何解決這個問題? 有沒有辦法解決這個問題,而無需對錶格做任何事情? 我可以添加另一個視圖,以某種方式包裝舊的視圖,但具有固定的屬性?

+2

EF代表「Enterprisey Fail」。這個問題*仍然*影響EF6.1 - #6002警告是壞的,但#6013「已被排除」錯誤,甚至沒有生成數據庫模型的視圖是* fail *。垃圾。 – user2864740 2015-01-19 22:55:07

回答

20

添加到實體模型的每個表或視圖都必須有一些關鍵字。它實際上不一定是主鍵。如果表沒有定義主鍵,EF將嘗試使用簡單規則推斷一個鍵:它將取所有不可空的非計算非二進制列並將它們標記爲實體鍵。如果沒有這樣的列存在,則不能自動添加該實體,並且設計者將拋出所提到的警告。解決方法是手動添加視圖並自行選擇密鑰,但一旦完成,您將無法使用從數據庫更新,因爲它會一直覆蓋您的更改。

您定義的密鑰應該是唯一的,否則您可能會在內部使用與identity map有關的其他問題。

+1

我將表格的一個字段標記爲主鍵,但EF仍不會加載視圖並說出同樣的問題。視圖沒有主鍵,但表具有。 EF如何知道哪個字段是視圖的主鍵? – Naor 2011-06-06 16:25:39

+0

我也有同樣的問題。 我改變了標記一個列作爲主鍵的表,但是沒有發生任何事情。 所以我刪除並重新創建數據庫中的視圖。 這樣做,EF已能夠導入視圖,但現在有這樣的錯誤: '<! - 生成期間發現的錯誤: 警告6002:表/視圖'ControlloSchedeLocal.dbo.VProdotti'沒有主鍵定義。關鍵是推斷出來的,定義是作爲只讀表/視圖創建的。 - >' – spiderman77 2012-11-20 12:21:53

25

只是一個列添加到您的觀點我添加了一個ROW_NUMBER來創建這樣

SELECT ISNULL(CAST((row_number() OVER (ORDER BY tab.ENTRYDATE)) AS int), 0) 
AS EDMXID,...other columns go on 

一個關鍵的標籤表達式是表的別名和entrydate僅僅是需要建立在SQL服務器FUNC ROW_NUMBER場。

你可以選擇不同的方式,例如,

select newid() as MYEDMXID,....so on 

希望幫助

+0

這樣您必須添加ORDER BY,因爲結果可以按不同順序排列,因此ID不會是唯一的。 – Naor 2012-05-04 18:52:20

+1

是的,你是對的,這個ID不是真正的ID,他們只是虛擬的。你管理索引和手工排序。他們不是真正的用途。只是一個提示。實體模型只是尋找真正的ID,但是當你知道索引是好的。但是你不能將它們添加到EDMX。 – 2012-05-06 08:25:34

+0

當您不使用默認生成的域服務類時,我的解決方案纔有效。如果您使用自定義來管理這些查詢並調用操作。它有幫助。否則,正如你所說的實體將是不同的。而你的最後一句話也是如我的第二個例子所示。包裝視圖。 – 2012-05-06 08:45:39

0

使用新表只與你的意見的鏈接,如果您有更多然後10萬行,EF6不是它更好的解決方案;)

CREATE TABLE dbo.TablePrimate(Id int CONSTRAINT PK_TablePrimate PRIMARY KEY (Id)) 
go 
set nocount on; 
DECLARE @i int; 
set @i=1 
WHILE @i<10000 
BEGIN 
    INSERT dbo.TablePrimate(Id) values(@i) 
    SET @i = @i + 1 
END 
--In fews seconds & 1 MB of storage 
GO 

現在用連接「 MyView「

CREATE VIEW dbo.vwTickets 
AS 
SELECT TP.Id, MyPKView.* FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY Ticket) Line, MyView.* 
    FROM (
     select Grupo, App, Ticket, Titulo, FApertura, Estado, Tipo from dbo.vwEvolutivos 
     union 
     select Grupo, App, Ticket, Titulo, FApertura, Estado, Tipo from dbo.vwIncidencias 
    ) MyView 
) MyPKView 
    JOIN dbo.TablePrimate TP ON TP.Id = Line 
0

爲什麼不簡單地將視圖轉換爲存儲過程。我嘗試沒有任何問題導入到EDMX模型,並沒有添加新的列。

+0

視圖是可組合的,比存儲過程更靈活。儘管在某些情況下它可能是一種解決方案,但絕對不是一般的解決方案。 – 2017-06-13 14:44:15

0

您可以通過將您的視圖與任何具有主列的任意表結合來輕鬆解決此問題。只要確保你只從表中獲取一行。

下面是一個例子:

CREATE VIEW dbo.myView 
 
AS 
 
SELECT 
 
\t -- This column enables EF-import via designer by enabling PK generation 
 
\t Id, 
 
\t -- These columns belong to the view 
 
\t [Count], 
 
\t [Sum] 
 
FROM 
 
(
 
SELECT 
 
\t COUNT(*) AS [Count] 
 
\t ,SUM(1) AS [Sum] 
 
FROM 
 
\t dbo.myTable 
 
) TheViewItself 
 
-- Grab a primary key of a single row from atable 
 
INNER JOIN (SELECT TOP 1 Id FROM dbo.TableWithPrimaryKey) Id ON 1 = 1

「ON 1 = 1」 聯接謂詞看起來很奇怪。但我需要這個來說服EF導入視圖。