无法将视图添加到 edmx

Posted

技术标签:

【中文标题】无法将视图添加到 edmx【英文标题】:cannot add view to the edmx 【发布时间】:2011-09-09 05:57:39 【问题描述】:

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

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

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

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

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

【问题讨论】:

EF 代表“企业失败”。此问题仍然影响 EF6.1 - #6002 警告很糟糕,但 #6013“已被排除”错误,甚至没有生成数据库模型的视图是 失败。垃圾。 【参考方案1】:

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

希望有帮助

【讨论】:

这种方式你必须添加 ORDER BY 因为结果可能有不同的顺序,因此 id 不会是唯一的。 是的,您是对的,这个 ID 不是真实的 ID,它们只是虚拟的。您可以手动管理索引和排序。它们不是真正使用的。只是一个提示。实体模型只是寻找真实的 ID,但是当你知道索引是好的时。但你不能将它们添加到 edmx。 当您不使用默认生成的域服务类时,我的解决方案才有效。如果您使用自定义文件管理这些查询并调用操作。它有帮助。否则,正如您所说的实体会有所不同。您的最后一句话也可以,如我的第二个示例所示。包装视图。 Davut..我很想让它工作,因为我想添加一个 select newid() 作为 myedmxid,但我收到错误消息“多部分标识符”tab.ENTRYDATE“不能发现...任何机会您都可以扩展您的答案,因为我很想在 edmx 中使用它 @julianguppy ENTRYDATE 是我的表格字段。使用表格的字段。这就是我正在做的事情,只是获取 oracle 的 rowid 之类的标识符。【参考方案2】:

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

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

【讨论】:

我将表的一个字段标记为主键,但 EF 仍然没有加载视图并说出同样的问题。视图没有主键,但表有。 EF 如何知道哪个字段是视图的主键? 我也遇到了同样的问题。我更改了将列标记为主键的表,Updated Model from Database,但什么也没发生。所以我删除并重新创建了数据库中的视图。这样做,EF 已经能够导入视图,但现在出现此错误:''【参考方案3】:

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

这是一个例子:

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

【讨论】:

虽然奇​​怪,但如果你不在乎你有一个实际的 id,这确实有效。谢谢【参考方案4】:

您可以使用“ISNULL”函数将您的视图列之一设置为不可为空,如下所示

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

GO

【讨论】:

这对我有用;使用 ISNULL 提示 SQL Server(和 EF)视图列永远不会为空,EF 会推断它。这仍然只会让您获得只读行为(对于大多数视图来说这很好),但您可以映射到更新 SP。【参考方案5】:

仅使用新表来链接您的视图,如果您的行数超过 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

【讨论】:

【参考方案6】:

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

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

我尝试添加 PostgreSQl 视图很久但没有成功。

【讨论】:

以上是关于无法将视图添加到 edmx的主要内容,如果未能解决你的问题,请参考以下文章

使用数据库中的更新模型添加只读视图

在实体框架 EDMX 中创建视图之间的关联时出错

当视图未将自身添加到其子视图时,“无法将自身添加为子视图”崩溃(带有示例代码)

无法将 3D 子视图添加到控制器的视图中

无法将顶部约束添加到视图

无法将空子视图添加到视图组 Nativescript-Vue