C# 无法将视图添加到edmx

C# 无法将视图添加到edmx,c#,.net,entity-framework,C#,.net,Entity Framework,尝试将视图添加到edmx文件时,不会发生任何操作。 我使用wxl编辑器打开了edmx文件,注意到以下错误: 警告6013:表/视图 “CellularOrders.dbo.V_LINK”没有 已定义主键且没有 无法推断有效的主键。 此表/视图已被排除。到 使用实体,您将需要 查看您的模式,添加正确的 键,并取消对其注释 重要的是,我没有也不需要将视图所基于的表添加到edmx中。此外,该视图仅用于对数据执行select语句 因此,在db中,我更新了T_链接表,并将反映在视图上的一个字段作为主键。然

尝试将视图添加到edmx文件时,不会发生任何操作。 我使用wxl编辑器打开了edmx文件,注意到以下错误:

警告6013:表/视图 “CellularOrders.dbo.V_LINK”没有 已定义主键且没有 无法推断有效的主键。 此表/视图已被排除。到 使用实体,您将需要 查看您的模式,添加正确的 键,并取消对其注释

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

因此,在db中,我更新了T_链接表,并将反映在视图上的一个字段作为主键。然后,当我再次尝试将视图添加到edmx时,不会再发生任何事情

我怎样才能解决这个问题?? 有没有一个选项可以在不对表做任何操作的情况下修复此问题?
我是否可以添加另一个视图,该视图将以某种方式包装旧视图,但具有固定属性?

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


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

只需在视图中添加一列,我添加了一个行号来创建这样的键

SELECT ISNULL(CAST((row_number() OVER (ORDER BY tab.ENTRYDATE)) AS int), 0) 
AS EDMXID,...other columns go on
选项卡表达式是表别名,entrydate只是sql server func内置的行号所需的字段

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

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

“希望”有助于将新表仅用于链接视图,如果您的行数超过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

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

以下是一个例子:

创建视图dbo.myView 像 选择 -此列通过启用PK生成,通过设计器启用EF导入 身份证件 -这些列属于视图 [计数], [总数] 从…起 选择 计数*为[计数] ,SUM1为[总和] 从…起 dbo.myTable 他们看到了自己 -从atable中获取单行的主键
内部连接从dbo.TableWithPrimaryKey Id ON 1=1中选择TOP 1 Id您可以使用ISNULL函数将其中一个视图列设置为不可为Null,如下所示

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视图很长一段时间,但没有成功。

我将表的一个字段标记为主键,但EF仍然没有加载视图,并指出相同的问题。视图没有主键,但表有主键。EF如何知道哪个字段是视图的主键?我也有同样的问题。我更改了将一列标记为主键的表,从数据库更新了模型,但什么也没发生。因此,我删除并重新创建了数据库中的视图。这样做,EF已经能够导入视图,但现在出现了这样的错误:这种方式您必须添加ORDER BY,因为结果的顺序可能不同,因此id将不唯一。是的,您是对的,此id不是真实id,它们只是虚拟的。您可以手动管理索引和排序。它们不是真正的用途。只是一个提示。实体模型只是寻找真正的ID,但当您知道索引正常时。但您不能将它们添加到edmx。我的解决方案仅在您不使用默认生成的域服务类时有效。如果您使用自定义文件管理这些查询并调用ops。这很有帮助。否则,正如你所说,实体将是不同的。你的最后一句话也很好,如我的第二个例子所示。wrapper view.Davut..我很想让它正常工作,因为我想添加一个select newid作为myedmxid,但我收到错误消息multi-part identifier tab.ENTRYDATE找不到。。。有没有可能你可以扩大你的答案,因为我很想让这个工作edmx@julianguppyENTRYDATE是我的表字段。使用表的字段。这就是我在那里做的,只是得到oracle的rowid-like identifier.EF是Enterprisey Fail的缩写。此问题仍然影响EF6.1-6002警告不正确,但6013已排除错误,甚至无法生成数据库模型的a视图。垃圾。奇怪的是,如果你不在乎你有一个真实的身份证,这确实有效。谢谢
List<users> _users = _context.users.SqlQuery("SELECT * FROM users_v").ToList<users>();