【问题标题】:EF DataContext incompatible with datagrid use of EF? (VS11)EF DataContext与EF的datagrid使用不兼容? (VS11)
【发布时间】:2012-04-09 02:46:00
【问题描述】:

我有一个带有 Microsoft Datagrid 的 VS11 beta WPF 应用程序,该应用程序基于 Entity Framework 5.0b2 模型(来自 sql server 数据库)中的表。 (网格使用通过从实体框架模型添加数据源并将表从该模型拖放到设计图面而自动生成的任何代码。)。然后,我使用 EF5.0 DBContext 代码生成器插件来生成可以在应用程序中使用的 DbContext 类型。

结果并不好。我得到一个似乎无法修复的编译错误;至少我的尝试让事情变得更糟。数据网格不喜欢 DbContext 并且不与它共存(当数据网格和 DbContext 都基于相同的数据库和表时)。是否有解决方法,可能是通过更改代码生成器模板?

错误信息粘贴在最后。感谢您对此的任何帮助或见解。

(请注意以下密切相关的帖子不是答案,因为虽然我可以将 dbcontext 转换为 objectcontext,但我无法让 datagrid 正常使用它;如果我将 objectcontext 转换为 dbcontext,我不会t 具有自动生成的 dbcontext 类型: Convert DBContext to ObjectContext for use with GridView)。我正在寻找一个相当简单的解决方法——如果我开始手动编码所有类型和转换,我确信有一个解决方法,但我想保持使用自动生成代码的易用性——我不想被占用代码生成器可以而且应该这样做。如果没有解决方案,我想我会将控件基于 ado.net,并将实体框架留给非 ui 代码。

错误
无法隐式转换类型 'System.Data.Entity.DbSet' 到 'System.Data.Objects.ObjectQuery'

Documents\Visual Studio 11\Projects\WpfApplication3\WpfApplication3\MainWindow.xaml.cs

导致错误的行(由 Microsoft 拖放以 EF 表为源的数据网格创建): System.Data.Objects.ObjectQuery myTblsQuery = myDbsEntities.MyTbls;

【问题讨论】:

  • 我认为这可能与 EF 不支持手动编译查询有关。但这只是猜测
  • 两边都有实体框架(有两个不同的api),datagrid控件使用的是object context api,不支持dbcontext api。存在冲突,因为这些 orm 框架中的整个约定是使用类型的实际对象名称;如果不是针对具有两个 api 的相同 orm (EF) 的这种奇怪情况,这是足够合理的。应该有一个简单的解决方案...

标签: wpf entity-framework wpfdatagrid visual-studio-2012 entity-framework-5


【解决方案1】:

在 WPF 设计器中通过拖放生成的代码从来都不是很好,而且 WPF 团队还没有更新它以使用 DbContext。您最好的选择是像其他答案建议的那样下拉到 ObjectContext,或者使用 DbContext 支持的更好的 WPF 数据绑定,但不使用拖放操作。

WPF 与 DbContext 的数据绑定非常容易,因为每个 DbSet 的 Local 属性实际上是一个 ObservableCollection,WPF 自然地绑定到它非常好。因此,例如,您最终会绑定您的视图源,如下所示:

categoryViewSource.Source = _context.Categories.Local;

此博文包含更多详细信息:http://blogs.msdn.com/b/adonet/archive/2011/03/14/10138486.aspx

【讨论】:

  • 我看到了那篇博文,以及这里的说明:
  • 谢谢,我看到了,以及这里的指示:msdn.microsoft.com/en-us/library/gg197522(v=vs.103).aspx 但它不起作用——我无法加载任何数据。我确实必须做一个改变:数据库是第一位的,我需要自动生成 dbcontext 代码,所以我依赖于自动生成的 dbcontext 代码(vs11 的 ef5.0 dbcontext 代码生成器插件)并进行了添加以使其保持一致有方向,但数据网格失败了。我会再看一遍,但是:1)我必须依赖自动生成器来生成 dbcontext 代码——dbs 很大; 2)保持简单。
  • 问题可能是微软提供的那些方向是代码优先。我怀疑 dbcontext 代码中的这一点(在说明中)是否足以将数据从 sql server 加载到网格中:_context.Departments.Load(); departmentViewSource.Source = _context.Departments.Local;工作 wpf 数据网格(使用旧版 ObjectContext)的自动生成代码如下所示: System.Data.Objects.ObjectQuery departmentQuery=this.GetDepartmentsQuery(SchoolEntities); departmentViewSource.Source=departmentsQuery.Execute(System.Data.Objects.MergeOption.AppendOnly);
  • 一旦 DbContext 找到了一个模型,它对于 Code First 和 Database First 的行为完全相同。例如,数据绑定到 Local 的工作方式相同。您评论中的 ObjectContext/ObjectQuery 代码本质上与 DbContext/DbQuery 代码执行相同的操作。两者都为您提供内存中的实体集合,然后将其绑定到数据源。主要区别在于 DbContext 版本会更好,因为 DbContext 提供了 ObservableCollection,而 ObjectContext 代码不提供。
  • 谢谢,那我不知道为什么代码不起作用。我刚开始使用 EF,所以我必须忽略一些明显需要的行。 msdn 文章和帖子中的示例代码不会从后端数据库中检索任何内容(与网格使用 ObjectContext 生成的代码不同,它可以正常工作)。或者它可能是在 dbcontext 代码生成器中出现了问题,尽管它的代码看起来与 msdn 示例代码相同。实际上,项目代码中没有对 dbquery 的调用(在快速搜索之后),但在示例代码中也没有。
猜你喜欢
  • 2021-08-27
  • 2020-01-02
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2012-06-05
相关资源
最近更新 更多