Entity Framework 5.0 + .NET 4.5 を使用しています
私はEFモデルの最初のアプローチを使用してデータベースを作成しました。データベースまたはデータベースへの変更が自動的に同期DataGridView
されるように、EFクラスを使用してデータベースにバインドしたいと考えています。DataGridView
これは私のコードです:
//form level fields
private BindingList<Product> _products;
private BindingSource _productSource = new BindingSource();
... in the form load event
//load the data from database using EF classes
var tmp = _context.BaseCategorySet.OfType<Product>().ToList();
//converting to IBindingList
_products = new BindingList<Product>(tmp);
_products.AllowEdit = true;
_products.AllowNew = true;
_productSource.DataSource = _products;
//setting GridControl's data source
ProductGrid.DataSource = _productSource;
新しい行を追加したり、データを変更したりできますが、それらの変更はデータベースに送信されません。
解決策を見つけるために私がした追加のこと...
1) コードを使用して、グリッド コントロールのデータを明示的にデータベースに更新するための [保存] ボタンを追加しました。
_productSource.EndEdit();
_context.SaveChanges();
->これにより、新しいレコードがデータベースに保存されませんでした
2) 個々のレコード プロパティ (テキスト ボックス、日付ピッカー) の一連のコントロールを使用して、新しいレコードを追加するコードを追加しました。
var x = _context.BaseCategorySet.Create<Product>();
//settting all the x properties with values
//that are set in aforementioned individual controls
_context.BaseCategorySet.Add(x);
_context.SaveChanges();
-->この手法を使用して新しいレコードを追加すると、データベースに保存されますが、これも奇妙な動作です。この新しいレコードは、グリッド コントロールに自動的に読み込まれません (ただし、対応するグリッドにグリッドをデータバインドしているため、そうする必要があります)。 EF DbSet...)
そしてもう1つの奇妙さ-DataGridView
データベースにロードされたレコードに対してコントロールで行った更新-それらの更新はデータベースに送信されます...
3) DevExpressXtraGrid
から標準DataGridView
制御に切り替えましたが、役に立ちませんでした...
EFデータバインディングに関する多くのトピックを検索しましたが、成功しませんでした...
これが問題かどうかはわかりませんが、エンティティ モデルで継承を使用しています:クラスProduct
から派生し、UnifOfSales
クラスから派生します。UnitOfSales
BaseCategory
私が試したもう一つのこと
この投稿でLadislav Mrnkaによって提案された (..).Local.ToBindingList を試しました 。
変更をデータベースに送り返しましたが、変更は基本クラス テーブル (BaseCategory) にのみ格納されましたが、派生クラス用のテーブルもあります。これは私がバインディングに使用したコードです
_context.BaseCategorySet.OfType<Product>.Load();
//i tried to use derived class with OfType<Product> to ensure that compiler
//knows that this is instance of derived class (Product),
//not the base class BaseCategory,
//but I can not get "Local" working with OfType...
ProductGridView.DataSource = _context.BaseCategorySet.Local.ToBindingList();