尝试将视图添加到edmx文件时,没有任何反应 我使用wxl编辑器打开了edmx文件,我注意到以下错误:
警告6013:表/视图 'CellularOrders.dbo.V_LINK'没有 有一个主键定义,没有 可以推断出有效的主键。 此表/视图已被排除。至 使用实体,您将需要 检查您的架构,添加正确的 键,并取消注释。
(重要的东西 - 我没有也不需要将基于视图的表添加到edmx。此外,该视图仅用于对数据执行select语句)
因此,在数据库中,我更新了T_LINK表,并将其中一个反映在视图上的字段作为主键。然后,当我再次尝试将视图添加到edmx时,再没有任何事情发生。
我该如何解决? 是否可以选择在不对表做任何事情的情况下解决这个问题? 我可以添加另一个视图,以某种方式包装旧视图但具有固定属性吗?
答案 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视图很长时间,但是没有成功。