加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:09:59 所属栏目:百科 来源:网络整理
导读:我试图用实体框架代码第一种方法连接到PostgreSQL数据库,当我在visual studio中使用实体数据模型向导从数据库生成C#类时,它可以为数据库中的每个表成功生成类,但数据库中的视图无法生成. Entity Data Model Wizard http://linearbench.com:9000/lbstest/ef.p
我试图用实体框架代码第一种方法连接到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版.

谢谢

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

视图的问题是实体框架很难确定它们的主键列.在Sql Server中,您可以使用ISNULL()函数来欺骗EF认为该列是一个键列,但postgres中的equvilant 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; }
}

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

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扩展,比如Where将它过滤到你想要的结果.

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

希望这可以帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读