当我在事件ID列上组合了许多表时,我在使用Entity Framework中的distinct()时遇到了麻烦,因此我决定在数据库中创建一个视图,而我只需要将其拉入EF并显示在datagrid上。
而EF给了我一个问题,我不知道如何解决,即使我拉出EF生成的SQL,我仍然看到它的sql命令没什么奇怪...
所以我在数据库中的视图会生成如下内容:
oID TIME LOC NETVAL INDIVALUE COUNT
01 10:00 A 0.803 0.803 6
02 8:00 B 1.164 1.164 1
02 8:00 B 1.164 1.252 1
02 8:00 B 6.012 1.164 1
02 8:00 B 6.099 6.099 1
但是,当我使用EF toList()视图时:
var query = context.MY_VIEW.toList();
datagridview1.DataSource = query;
我明白了:
oID TIME LOC NETVAL INDIVALUE COUNT
01 10:00 A 0.803 0.803 6
02 8:00 B 1.164 1.164 1
02 8:00 B 1.164 1.164 1
02 8:00 B 1.164 1.164 1
02 8:00 B 1.164 1.164 1
我还检查了EF生成的sql并看到没有异常,只是简单的嵌套语句选择....
答案 0 :(得分:1)
您需要在视图上设置主键。看起来EF使用oID
字段作为默认主键。您必须设置主键,然后更新模型。请参阅此链接http://girlfromoutofthisworld.com/entity-framework-and-setting-primary-keys-on-views/
答案 1 :(得分:0)
关于antar125的答案。它对我来说并不适合锻炼,因为我使用的是Oracle数据库,而Coalesce并不适合我。 我找到了一些其他的选择,我希望它能帮助那些寻找解决这个问题的人。
发现同样的问题,人们在这里讨论: Duplicate Rows when Data Binding with LINQ to Entities
http://markcoleman.tumblr.com/post/25026903967/entityframework-and-a-view-with-no-primary-key
一个选项: http://elegantcode.com/2012/03/15/querying-entityframework-views-without-a-key/ 那个人对我不起作用,因为它给了我一个例外,说数据库中没有视图,可能对其他人有用。
显示视图的另一种方法来自遗留数据库(如果您只是想查看它)完全绕过EF。当您删除您使用的datagridview或w / e容器时,请在设计器窗口中将其与视图进行数据绑定。它正确显示给我:)
甜!!