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

Ter*_*yLi 6 .net c# postgresql npgsql entity-framework-6

我试图用实体框架代码第一种方法连接到PostgreSQL数据库,当我在visual studio中使用实体数据模型向导从数据库生成C#类时,它可以为数据库中的每个表成功生成类,但数据库中的视图无法生成. 实体数据模型向导http://linearbench.com:9000/lbstest/ef.png C#类生成http://linearbench.com:9000/lbstest/code.png

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

谢谢

Van*_*cio 1

我知道这个问题现在有点老了,但我会在这里为其他可能在这里寻找解决方案的人插话。我的答案可能并不完全是问题所寻找的,但是,它足以作为我的解决方案。

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

然而,就能够将视图查询到视图对象而言,模拟我所需的功能就是使用调用 Database.SqlQuery 的函数扩展上下文类并将其作为 Queryable 返回

例如:

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

public class foo
{
    public int id { get; set; }
    public string bar { get; set; }
    public string baz { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后用这样的部分类定义扩展你的上下文类

public partial class FooContext : DbContext
{
    public IQueryable<foo> foo => 
        this.Database.SqlQuery<foo>( "select * from foo" ).AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)

然后您可以像任何其他表一样从上下文中查询它

context.foo.where( x => id > 100 ).toList(); //etc,etc
Run Code Online (Sandbox Code Playgroud)

您将无法执行插入或使用标准 DbSet 通常附带的任何额外功能,但视图通常用作只读查询(除非您使用一些特殊的插入触发器)...

但这为您提供了一个将查询整个视图的基本调用,并且它不会访问数据库,因为它保留为可查询的,因此您可以自由地调用其上的任何其他 LINQ 扩展,例如在哪里将其过滤到你想要的结果。

我使用 npgsql lib 从 sql server 迁移到 postgres sql,这个修复允许我的视图工作,而无需对我的程序代码库进行任何更改,就像根本没有任何更改一样,尽管 edmx 不会生成由于缺少(可辨别的)主键,我的视图对象。

希望这可以帮助!