簡體   English   中英

無法將視圖添加到 edmx

[英]cannot add view to the edmx

嘗試將視圖添加到 edmx 文件時,沒有任何反應。
我使用 wxl 編輯器打開了 edmx 文件,我注意到以下錯誤:

警告 6013:表/視圖“CellularOrders.dbo.V_LINK”沒有定義主鍵,無法推斷出有效的主鍵。 此表/視圖已被排除。 要使用實體,您需要查看架構、添加正確的鍵並取消注釋。

(重要的是 - 我沒有也不需要將視圖基於的表添加到 edmx。此外,該視圖僅用於對數據執行 select 語句)

所以在數據庫中,我更新了 T_LINK 表,並將反映在視圖上的字段之一作為主鍵。 然后,當我再次嘗試將視圖添加到 edmx 時,什么也沒有發生。

我該如何解決這個問題? 有沒有一個選項可以在不對桌子做任何事情的情況下解決這個問題? 我可以添加另一個以某種方式包裝舊視圖但具有固定屬性的視圖嗎?

只需在您的視圖中添加一列我添加了一個 Row_Number 來創建這樣的鍵

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

tab 表達式是表別名,entrydate 只是 sql-server 函數中內置的 row_number 所需的字段。

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

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

希望有幫助

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

您定義的密鑰應該是唯一的,否則您可能會遇到與內部使用的身份 map相關的一些其他問題。

您可以通過將視圖與具有主列的任意表連接起來輕松解決此問題。 只要確保你只從表中抓取一行。

這是一個例子:

 CREATE VIEW dbo.myView AS SELECT -- This column enables EF-import via designer by enabling PK generation Id, -- These columns belong to the view [Count], [Sum] FROM ( SELECT COUNT(*) AS [Count],SUM(1) AS [Sum] FROM 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 導入視圖。

僅使用新表與您的視圖鏈接,如果您有超過 100k 行,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

您可以使用“ISNULL”function 將您的視圖列之一設置為不可為空,如下所示

ALTER VIEW [dbo].[MyView] 
AS
  SELECT 
   ISNULL([StringID],'') AS [Id],
   [Name]
 FROM [Table]

GO

您可以在數據庫中創建視圖並在代碼中進行如下查詢:

List<users> _users = _context.users.SqlQuery("SELECT * FROM users_v").ToList<users>();

我嘗試添加 PostgreSQl 視圖很長時間但沒有成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM