DataBinding DataGridView для EF.DbSet, как отправить новые строки DataGridView в DbSet?

Я хочу привязать свой элемент управления DataGridView к базе данных через модель Entity (созданную с использованием первого подхода к модели), я использую EF 5.0, .NET 4.5 и winforms

Моя привязка организована следующим образом:

DataGridView->BindingSource->BindingList->EF.DbSet->База данных

Результат (проблема)

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();
    }

person Prokurors    schedule 30.09.2013    source источник


Ответы (1)


Наконец-то мне удалось это решить!

Вместо этих строк:

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

я использую эту строку:

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

Где Persons — это DbSet‹> из моего DbContext

И еще одна вещь, которую я не мог понять, - это попытка заставить эту работу работать с производными классами моделей EF - скажем, у меня есть класс BasePerson и класс DerivedPerson. EF создает DbSet только для BasePerson (включая все производные экземпляры, доступные через метод OfType). Я не смог заставить работать .Local.ToBindingList для этих производных классов.

Хитрость для производных классов заключалась в том, чтобы добавить DbSet для этих производных классов в класс DbContext!

person Prokurors    schedule 20.10.2013
comment
Обратите внимание, что вызов _context.Persons.Local.ToBindingList() может добавить большой удар по производительности. - person MCattle; 11.09.2014
comment
Однако, чтобы добавить к этому, если вы ограничиваете продолжительность жизни вашего контекста (скажем, сроком жизни формы) и не загружаете миллионы объектов, вы можете быть в порядке. Это то, что можно определить, просто следя за производительностью. - person MCattle; 12.09.2014