无法首先使用Npgsql EF6代码从PostgreSQL视图生成C#类
我试图用实体框架代码第一种方法连接到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不会生成由于缺少(可辨别的)主键,我的视图对象. 希望这可以帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |