无法将视图添加到edmx

尝试将视图添加到edmx文件时,没有任何反应。
我使用wxl编辑器打开了edmx文件,我注意到以下错误:

警告6013:表/视图’CellularOrders.dbo.V_LINK’没有定义主键,也没有推断出有效的主键。 此表/视图已被排除。 要使用该实体,您需要检查您的架构,添加正确的密钥并取消注释。

(重要的东西 – 我没有也不需要将基于视图的表添加到edmx。此外,该视图仅用于对数据执行select语句)

因此,在数据库中,我更新了T_LINK表,并将其中一个反映在视图上的字段作为主键。 然后,当我再次尝试将视图添加到edmx时,再也没有发生。

我怎么解决这个? 有没有选项来解决这个问题而不对表做任何事情? 我可以添加另一个视图,以某种方式包装旧视图但具有固定属性?

添加到实体模型的每个表或视图都必须具有一些键。 它实际上不一定是主键。 如果表没有定义主键,EF将尝试使用简单规则推断密钥:它将采用所有非可空的非计算非二进制列并将它们标记为实体密钥。 如果没有这样的列存在,则无法自动添加实体,并且设计者将抛出上述警告。 解决方法是手动添加视图并自行选择密钥,但一旦执行此操作,就无法使用数据库更新,因为它将始终覆盖您的更改。

您定义的键应该是唯一的,否则您可能会遇到与内部使用的身份映射相关的其他一些问题。

只需在视图中添加一列我添加了一个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 func中构建的row_number所需的字段。

你可以选择不同的方式,例如

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

希望有帮助

仅使用新表作为与您的视图的链接,如果您有超过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 

您可以通过将视图与任何具有主列的任意表连接来轻松解决此问题。 只需确保您只从表中抓取一行。

这是一个例子:

 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