【问题标题】:Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery) is not supported Entity Framework 5不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)实体框架 5
【发布时间】:2015-08-27 14:59:29
【问题描述】:

我有一个 devexpress GridControl,我正在为其设置数据源,如下所示:

var regs = (from vcap in context.chaps
                             select vcap);

gridControl1.DataSource = new BindingList<chaps>(regs.ToList());

但是当我使用网格时,我添加或删除的行不会被保存,只会保存对初始行的更改。

如果我这样做:

gridControl1.DataSource = context.chaps.Local;

我没有得到任何行,AddNewRow 甚至没有在视觉上添加新行。

如果我这样做:

gridControl1.DataSource = context.chaps.ToList();

我得到了行并且可以保存对它们的更改;行在视觉上被删除但不在数据库中,并且不能AddNewRow

如果我这样做:

gridControl1.DataSource = context.chaps;

我得到了这个例外:

Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery) is not supported. Instead populate a DbSet with data, for example by calling Load on the DbSet, and then bind to local data. For WPF bind to DbSet.Local. For WinForms bind to DbSet.Local.ToBindingList().

但是 context.chaps.Local 也没有 ToBindingList 方法。

我不认为这是 devexpress 的问题,而是我不知道如何正确设置数据源。有没有办法获得context.chaps.Local.ToBindingList() 等价物?

【问题讨论】:

    标签: devexpress entity-framework-5 datasource


    【解决方案1】:

    context.chaps.Local 是一个ObservableCollection&lt;T&gt;。但是ToBindingList不是ObservableCollection&lt;T&gt;的方法而是DbExtensions的扩展方法:

    public static BindingList<T> ToBindingList<T>(
        this ObservableCollection<T> source) where T : class;
    

    为了使用此方法并通过 Intellisense 查看它,您需要在尝试调用 ToBindingList() 的代码文件中包含相应的命名空间:

    using System.Data.Entity;
    

    【讨论】:

    • 所以我做了 gridControl1.DataSource = DbExtensions.ToBindingList(context.capitulo.Local);这完全有效!我可以添加、修改和删除。除了它没有加载我最初拥有的所有行(我的数据网格是空的)。知道怎么做吗?还是我误解了答案?
    • @user2414791:使用扩展方法时的标准语法与普通实例方法一样:gridControl1.DataSource = context.capitulo.Local.ToBindingList();。但我不认为它会解决问题。当然,您仍然必须使用regs.ToList()regs.Load()context.chaps.Load() 从数据库加载任何内容。 Local 不运行查询,它只是将之前已经加载的实体作为ObservableCollection 提供。
    【解决方案2】:

    确保在将数据源绑定到绑定列表之前已加载所有行。

    context.chaps.load '加载你的数据 gridcontrol1.datasource = context.chaps.Local.ToBindingList() ' 这将在网格上加载记录。还给你一个新行来添加新的,或者你也可以更新网格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多