不要保存在BindingSource中使用IQueryable

本文关键字:IQueryable BindingSource 保存 存在 | 更新日期: 2023-09-27 18:02:51

我创建了一个带有DbSet属性的代码优先上下文

我使用Windows窗体。如果我这样绑定:

_context.Schedules.Load();
scheduleBindingSource.DataSource = _context.Schedules.Local.ToBindingList();

所有的工作都很好,当我保存如下:

this.Validate();
scheduleBindingSource.EndEdit();
_context.SaveChanges();

数据仍然存在;但是当我像这样绑定数据时:

var res = _context.Schedules.Where(k => k.EmployeeName.Equals(employeeComboBox.Text)).ToList();
scheduleBindingSource.DataSource = res;

当我保存数据不持久!

我认为ToList()方法不好,但我找不到替代方法来将BindingList连接到上下文中的本地数据集。

谢谢,

Andrea

不要保存在BindingSource中使用IQueryable

你可以试试:

_context.Schedules.Where(k => k.EmployeeName.Equals(employeeComboBox.Text)).Load();
scheduleBindingSource.DataSource = _context.Schedules.Local.ToBindingList();

应该只带来满足条件的时间表。当您在Where方法之后调用Load方法时,它只会将满足条件的记录带到内存中。稍后,当您调用Local属性时,它将为您提供一个ObservableCollection<Schedule>,其中包含当前由DbContext跟踪的所有对象,这些对象将是您之前加载的元素。最后,当您调用ToBindingList扩展方法时,它将返回与给定的ObservableCollection<Schedules>保持同步的BindingList<Schedule>

导致数据不持久的原因是由DataGridView(或BindingSource)引起的,它们没有向上下文添加刚刚添加的行的新距离。

所以我禁用了AllowUserToAddRow属性(现在我使用BindingNavigator添加按钮)

并按如下方式实现这两个事件:

private void scheduleBindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
    _scheduleAdding = true;
}
private void scheduleBindingSource_CurrentChanged(object sender, EventArgs e)
{
    if (_scheduleAdding)
    {
        Schedule s = (Schedule)scheduleBindingSource.Current;
        s.EmployeeName = employeeComboBox.Text;
        s.From = new DateTime(dateTimePicker1.Value.Year, dateTimePicker1.Value.Month, 1);
        _context.Schedules.Add(s);
        _scheduleAdding = false;
    }
}