不要保存在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
你可以试试:
_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;
}
}