3

我想通过实体模型(使用模型优先方法创建)将我的 DataGridView 控件数据绑定到数据库,我正在使用 EF 5.0、.NET 4.5 和 winforms

我的绑定组织如下:

DataGridView->BindingSource->BindingList->EF.DbSet->Database

结果(问题)是

1) 对现有记录的更新工作正常

2)插入被发送到 BindingList,但它们不会被发送到 EF.DbSet

这可能是什么原因,我该如何解决?

我的代码:

    //form level objects
    private BindingList<Person> persons;
    private BindingSource pSource=new BindingSource();

    private void Form1_Load(object sender, EventArgs e)
    {
        _context=new TestEFmodelContainer();
        var p = _context.PersonSet.ToList();
        persons = new BindingList<Person>(p); //getting bindinglist
        persons.AllowEdit = true;
        persons.AllowNew = true;

        pSource.DataSource = persons;
        pSource.AllowNew = true;

        personDataGridView.DataSource = pSource;
    }

    //"Save changes to DB" button
    private void SaveChangesToDB_Click(object sender, EventArgs e)
    {
        _context.SaveChanges();
    }
4

1 回答 1

3

我终于设法解决了这个问题!

而不是这些行:

    persons = new BindingList<Person>(p); //getting bindinglist
    ...
    pSource.DataSource = persons;

我用这条线:

    pSource.DataSource = _context.Persons.Local.ToBindingList();

Persons 是我的 DbContext 中的 DbSet<>

我想不通的另一件事是尝试使用派生的 EF 模型类进行这项工作 - 假设我有一个 BasePerson 类和 DerivedPerson 类。EF 仅为 BasePerson 创建 DbSet(包括所有派生实例,可通过 OfType 方法访问)我无法为这些派生类工作 .Local.ToBindingList。

派生类的诀窍是在 DbContext 类中为那些派生类添加 DbSet!

于 2013-10-20T15:16:32.973 回答