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

时间:2015-04-27 23:52:31

标签: c# .net postgresql entity-framework-6 npgsql

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

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

由于

1 个答案:

答案 0 :(得分:1)

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

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

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

例如:

假设数据库中有一个视图," 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();
}

然后您可以从您的上下文中查询它与任何其他表

相同
context.foo.where( x => id > 100 ).toList(); //etc,etc

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

但是这会给你一个基本调用来查询整个视图,并且它不会命中数据库,因为它的左边是可查询的,所以你可以自由地调用它上面的任何其他LINQ扩展。如何过滤到您想要的结果。

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

希望这有帮助!