C# 无法使用Npgsql+从PostgreSQL视图生成C类;EF6代码优先

C# 无法使用Npgsql+从PostgreSQL视图生成C类;EF6代码优先,c#,.net,postgresql,entity-framework-6,npgsql,C#,.net,Postgresql,Entity Framework 6,Npgsql,我尝试使用entity framework code first方法连接PostgreSQL数据库,当我在visual studio中使用entity data model向导从数据库生成C#class时,它可以成功地为数据库中的每个表生成类,但无法生成数据库中的视图。 (来源:) (来源:) 有人能告诉我哪里做错了吗?我使用实体框架6.1.3和Npgsql 2.2.5。PosgreSQL数据库是安装在Ubuntu服务器上的9.3.6版本 谢谢我知道这个问题现在有点老了,但我会在这里为任何可

我尝试使用entity framework code first方法连接PostgreSQL数据库,当我在visual studio中使用entity data model向导从数据库生成C#class时,它可以成功地为数据库中的每个表生成类,但无法生成数据库中的视图。
(来源:)


(来源:)

有人能告诉我哪里做错了吗?我使用实体框架6.1.3和Npgsql 2.2.5。PosgreSQL数据库是安装在Ubuntu服务器上的9.3.6版本


谢谢

我知道这个问题现在有点老了,但我会在这里为任何可能在这里寻找解决方案的人插上一句。我的答案可能并不完全是这个问题想要的,但是,对于我来说,它已经足够作为一个变通解决方案了

视图的问题在于实体框架很难确定它们的主键列。在Sql Server中,可以使用ISNULL()函数诱使EF认为该列是键列,但postgres中的equalant coalesce()函数对EF来说不够好。我还尝试生成自动递增的row id列,用主键连接到其他表,等等;这些都不走运

然而,为了能够将我的视图查询到我的视图对象中,我所需要的功能几乎已经得到了模拟,这就是使用调用Database.SqlQuery的函数扩展您的上下文类,并将其作为可查询项返回

例如:

假设数据库中有一个视图“foo”,其列id、bar、baz。您可以编写自己的POCO来保存视图数据,如下所示

public class foo
{
    public int id { get; set; }
    public string bar { get; set; }
    public string baz { get; set; }
}
然后用这样的部分类定义扩展上下文类

public partial class FooContext : DbContext
{
    public IQueryable<foo> foo => 
        this.Database.SqlQuery<foo>( "select * from foo" ).AsQueryable();
}
您将无法执行插入或使用标准DbSet通常附带的任何额外功能,但无论如何,视图通常用作只读查询(除非您使用一些特殊的插入触发器)

但这会给您一个基本调用,它将查询整个视图,并且不会命中数据库,因为它作为可查询的对象保留,因此您可以自由调用它上的任何其他LINQ扩展,例如从何处筛选它以获得所需的结果

我使用npgsql lib从sql server迁移到postgres sql,此修复允许我的视图工作,而无需对程序代码库进行任何更改,就好像什么都没有更改一样,尽管edmx由于缺少(可识别的)主键而无法生成我的视图对象


希望这有帮助

这不是代码优先的VMAtm,请注意,我确实在实体数据模型向导中选择了“数据库代码优先”。
context.foo.where( x => id > 100 ).toList(); //etc,etc