【问题标题】:BindingSource and Entity Framework are not aware of each otherBindingSource 和 Entity Framework 不知道对方
【发布时间】:2015-01-20 16:59:18
【问题描述】:

在我们的项目中我们正在使用

  • 实体框架
  • 存储库模式 + 工作单元模式一起
  • 我们正在使用 DevExpress 控件。

在开始时,在 Gosha 的建议下,我现在使用 LIST(感谢 gosha),我将代码更新为 BINDINGLIST 初始化我们的网格的相关代码部分是:

// New repository instance by UOW (unit of work)
repXtraGridAddXtraEditor = new RepositoryObject.DesignLayer.XtraGridViewAddXtraEditorRep(UOW, true);
// new bindinglist and fill it    
blAddXtraGridEditor = new BindingList<BusinessObject.DesignLayer.XtraGridViewAddXtraGridEditor>(repXtraGridAddXtraEditor.Query(t => t.XtraGridViewId == XtraGridViewId).ToList());

// BindingSource bsource to be filled by blAddXtraGridEditor 
bSource = new BindingSource(); // { DataSource = XtraGridViewXtraGridEditorList};
bSource.DataSource = blAddXtraGridEditor;
// PASS İT TO GRID
grdXtraGridAddXtraEditor.DataSource = bSource;

现在

  1. 网格 > grdXtraGridAddXtraEditor
  2. BindingSource> bSource
  3. BindingList> blAddXtraGridEditor

are AWARE OF EACH OTHER,这意味着当我们从网格中删除一条记录时,它也会从 Bindingsource 和 bindinglist 中删除

当我们从网格中删除一行时

// Delete from grid ( from screen)
gvwXtraGridAddXtraEditor.DeleteRow(gvwXtraGridAddXtraEditor.FocusedRowHandle);

//reflect changes to DB
UOW.Db.SaveChanges();  // WHICH MAKES NOTHING :)

其他对将更改保存到 Db 的结果没有影响的代码:

bSource.EndEdit();
blAddXtraGridEditor.ResetBindings();
bSource.ResetBindings(false);
UOW.Db.SaveChanges();

删除不会反映到 EntityFramework(and or UOW)

换句话说,网格和实体框架不知道对方。

  1. 我有什么遗漏吗?
  2. 有更好的选择吗?

提前谢谢大家

【问题讨论】:

    标签: c# winforms data-binding devexpress


    【解决方案1】:

    您调用 ToList 方法来获取记录。 IList 接口不支持其更改的通知。你需要 IBindingList。使用DbExtensions.ToBindingList方法获取。该方法是ObservableCollection&lt;T&gt; 类的扩展方法。您应该使用它来返回您的数据源。我在 DevExpress 上找到了 Building a simple Expense Tracker application using Grid Control for Windows Forms. Part 1. Creating a new Data Bound application. 文章,在这里可能会有所帮助。

    【讨论】:

    • 嗨@gosha,更新了问题。你能再检查一下吗谢谢
    • 说实话,不确定blAddXtraGridEditor = new BindingList&lt;BusinessObject.DesignLayer.XtraGridViewAddXtraGridEditor&gt;(repXtraGridAddXtraEditor.Query(t =&gt; t.XtraGridViewId == XtraGridViewId).ToList()); 是否有效。试试blAddXtraGridEditor = repXtraGridAddXtraEditor.Query(t =&gt; t.XtraGridViewId == XtraGridViewId).ToBindingList();
    • 顺便说一句,尝试将 DevExpress Grid 替换为标准 DataGridView。它们的工作方式是否相同?
    • 嗨 Gosha,blAddXtraGridEditor = repXtraGridAddXtraEditor.Query(t => t.XtraGridViewId == XtraGridViewId).ToBindingList() >>>> ToBindingList 不可用?
    • 此方法适用于 ObservableCollection。 EF 通常会返回它们。您可以访问您的存储库中的 ObservableCollection 吗?
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多