Подтвердить что ты не робот

Как получить список измененных объектов в Entity Framework 5

Я привязываю список entities к виду сетки данных следующим образом:

var orders = context.Order.ToList();

BindingList<Order> orderList = new BindingList<Order>(orders);

dataGridView1.DataSource = orderList;

Пользователь может редактировать или добавлять новые данные непосредственно в datagridview. Когда пользователь нажимает кнопку Save, чтобы оптимизировать производительность, я хочу получить список сущностей, которые были изменены/новые для выполнения вставки/обновления. Как я могу достичь этого?

EDIT Определить добавление новой строки в gridview:

BindinList<Order> orders = (BindingList<Order>)dataGridView1.Datasource;

order.Add(new Order());

РЕДАКТИРОВАТЬ 2 Решить:

BindinList<Order> orders = (BindingList<Order>)dataGridView1.Datasource;

Order order = new Order();

context.Order.Add(order);

order.Add(order);
4b9b3361

Ответ 1

List<Object> modifiedOrAddedEntities = context.ChangeTracker.Entries()
 .Where(x => x.State == System.Data.EntityState.Modified 
        || x.State == System.Data.EntityState.Added)
 .Select(x=>x.Entity).ToList();

При привязке объектов EF к DataGridView часто предпочтительнее создать IBindingList из DbSet.Local ObservableCollection. Таким образом вы получаете двустороннюю привязку данных, и ваши новые сущности автоматически добавляются в контекст при добавлении через BindingSource.Add() или IBindingList.Add(). Самый простой способ получить эту работу, после правильной привязки, - установить DataGridView.AllowUserToAddRows на истинные и новые строки, которые будут вводить пользователи, будут новыми объектами, добавленными в контекст.

context.Orders.Load();
BindingList<Order> bindingList = context.Orders.Local.ToBindingList();
BindingSource ordersBindingSource = new BindingSource();
ordersBindingSource.DataSource = bindingList;
dataGridView1.DataSource = ordersBindingSource ;

System.Data.Entity следует ссылаться на использование .ToBindingList(), и вы должны использовать EF4.1 или больше.