2013-07-04 86 views
20

得到修改的對象的名單,我綁定的entities列表,像這樣的數據網格視圖:如何在實體框架5

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

回答

39
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通常優選以創建DbSet.Local的。通過這種方式,您可以獲得雙向數據綁定,並且通過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 ; 

System.Data.Entity必須參考使用.ToBindingList(),你必須使用EF4.1或更大。

+0

感謝您的快速響應。您的代碼可以獲取修改後的實體列表,但無法獲取新實體列表。我提供用於添加新實體的代碼。你能幫我弄清楚嗎? –

+0

@DoanCuong,請參閱附加答案的詳細信息。 – 2013-07-04 07:06:19

+0

不好意思,請問如何實現'BindingSource.Add()'或'IBingdingList.Add()'?還有一件事,'dbset.local'上沒有'ToBindingList()'函數。唯一的方法是使用 'var bindingList = new BindingList (context.Orders.Local.ToList());' –