无法将视图添加到edmx

时间:2011-06-06 11:58:33

标签: c# .net entity-framework

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

  

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

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

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

我该如何解决? 是否可以选择在不对表做任何事情的情况下解决这个问题? 我可以添加另一个视图,以某种方式包装旧视图但具有固定属性吗?

6 个答案:

答案 0 :(得分:30)

只需在视图中添加一列我添加了一个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

希望帮助

答案 1 :(得分:28)

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

您定义的密钥应该是唯一的,否则您可能会遇到与内部使用的identity map相关的其他问题。

答案 2 :(得分:2)

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

以下是一个例子:

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导入视图。

答案 3 :(得分:1)

仅将新表用于与您的观看次数的链接,如果您的行数超过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

现在加入&#34; MyView&#34;

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

答案 4 :(得分:0)

您可以使用“ ISNULL”函数将视图列之一设置为不可为空

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

GO

答案 5 :(得分:0)

您可以在数据库中创建一个视图,并在代码中进行如下查询:

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

我试图添加PostgreSQl视图很长时间,但是没有成功。