2013-07-04 21 views
20

に変更されたオブジェクトのリストを取得するにはどうすればこのようなデータグリッドビューにentitiesのリストを結合しています:Entity Frameworkの5

var orders = context.Order.ToList(); 

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

dataGridView1.DataSource = orderList; 

ユーザーが編集したり、直接のDataGridViewに新しい追加することができます。ユーザーがSaveボタンをクリックすると、パフォーマンスを最適化するために、変更/新規作成されたエンティティのリストを取得して挿入/更新を実行したいと考えています。どうすればこれを達成できますか?

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

order.Add(new Order()); 

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

を、多くの場合、作成することが好ましいDataGridViewにEFエンティティをバインドするときは、GridViewのに新しい行を追加定義

EDIT IBindingListDbSet.LocalObservableCollection。このようにして、双方向のデータバインディングを取得し、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、追加の回答の詳細を参照してください。 –

+0

すみませんが、 'BindingSource.Add()'や 'IBingdingList.Add()'の実装方法を教えてください。そしてもう一つ、 'dbset.local'に' ToBindingList() '関数がありません。これを行う唯一の方法は、 'var bindingList = new BindingList (context.Orders.Local.ToList());' –