如何在Entity Framework 5中获取修改对象列表

24
我将绑定实体列表到数据网格视图,代码如下:
var orders = context.Order.ToList();

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

dataGridView1.DataSource = orderList;

用户可以直接在datagridview上编辑或添加新内容。当用户点击保存按钮时,为了优化性能,我希望检索已更改/新增的实体列表以执行插入/更新操作。如何实现此目标?

编辑定义向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);
1个回答

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

将EF实体绑定到DataGridView时,通常最好从DbSet.Local ObservableCollection创建一个IBindingList。这样,您可以获得双向数据绑定,并且通过BindingSource.Add()IBindingList.Add()添加时,您的新实体会自动添加到上下文中。一旦正确绑定,使DataGridView.AllowUserToAddRows为true,然后用户输入的新行将成为添加到上下文中的新实体。

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

要使用 .ToBindingList(),必须引用 System.Data.Entity,并且您必须使用 EF4.1 或更高版本。


感谢您的快速回复。您的代码可以获取修改后的实体列表,但无法获取新实体列表。我提供了用于添加新实体的代码。您能帮我找出问题吗? - Doan Cuong
@DoanCuong,请查看附加的答案细节。 - user1914530
请问您能否告诉我如何实现 BindingSource.Add() 或者 IBindingList.Add() 呢?另外,dbset.local 上没有 ToBindingList() 函数。唯一的方法是使用 var bindingList = new BindingList<Orders>(context.Orders.Local.ToList()); - Doan Cuong
@DoanCuong,回答已更新。根据您的实体,它可能比我展示的更复杂,但通过一些研究,您应该能够解决它。 - user1914530

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接