1

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クラスから派生します。UnitOfSalesBaseCategory

私が試したもう一つのこと

この投稿で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(); 
4

1 に答える 1