繁体   English   中英

EF不要在BindingSource中使用IQueryable进行保存

[英]EF Don't save using IQueryable in BindingSource

我已经使用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连接到上下文中的Local数据集。

谢谢,

安德里亚

你可以试试这个:

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

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

导致数据不持久的原因是由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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM