实体框架5-本地绑定列表-筛选
本文关键字:列表 筛选 绑定 框架 5-本 实体 | 更新日期: 2023-09-27 18:25:33
希望有人能指出如何做到这一点:
我有一个使用实体框架的WinForms应用程序。例如,我们通过提供BindingList的存储库将数据绑定到gridControl。
例如(简化代码)
class ProductRepository {
public void LoadAll() {
_context.Products.Where(p => p.Deleted == false).Load();
}
public BindingList<T> GetBindingList() {
LoadAll();
return _context.Products.Local.ToBindingList();
}
}
class ProductListPresenter {
private void SetList() {
_view.SetList(productRepo.GetBindingList());
}
}
class ProductListView {
DeletedButton.Click += {
(bindingSource1.Current as Product).Deleted = 1;
gridControl1.Refresh();
};
}
但是:我只想显示未删除的产品(Product.deleted==false)。在RepositoryLoad()方法中过滤它是可以的,但是当我已经将它绑定到我的控件时,我该如何过滤它呢?我不能执行bindingSource1.RemoveCurrent(),因为它会完全擦除实体并将其标记为State。Deleted。.
这里需要考虑的另一件事是:我在该表单中还有其他一些事情要做,只有当用户决定通过单击"保存"按钮保存更改时,我才需要在数据库中提交所有更改。在用户明确保存更改之前,我必须使用内存中的状态。
有什么建议吗?在WinForms中使用EF在某种程度上开始提高挫败感。。
因为您是从逻辑上而不是从物理上删除,所以您需要将删除事件冒泡到可以访问存储库或上下文的层,然后保存更改,然后将实体从上下文分离。示例:
class ProductListPresenter {
private void DeleteHandler(Object sender, EventArgs e)
{
productRepo.SaveChanges();
productRepo.DetachLogicallyDeletedEntities();
}
}
class ProductRepository
{
public void DetachLogicallyDeletedEntities()
{
foreach(var entity in _context.Products.Local
.Where(p=>p.Deleted == 1).ToList())
_context.Entry(entity).State = EntityState.Detached;
}
}
如果不希望这样做,那么另一个选项是不绑定到上下文本地集合,而是绑定到独立的BindingList<>
,然后可以直接在视图层中将其从列表中删除。
class ProductListView {
DeletedButton.Click += {
(bindingSource1.Current as Product).Deleted = 1;
bindingSource1.Remove(bindingSource1.Current);
};
}
第三种方式是创建IBindingListView
的实现,该实现保存并缓存上下文本地ObservableCollection<>
,并在本地集合保存的内容与提供给显示的内容之间提供间接层。通过这种方式,您可以使用BindingSource.Filter
属性来提供筛选字符串。