3

エンティティ モデル (モデル ファースト アプローチで作成) を介して DataGridView コントロールをデータベースにデータバインドしたいのですが、EF 5.0、.NET 4.5、および winforms を使用しています。

私のバインディングは次のように構成されています。

DataGridView->BindingSource->BindingList->EF.DbSet->データベース

結果(問題)は

1) 既存のレコードの更新が適切に機能している

2)挿入は BindingList に送信されますが、EF.DbSet には送信されません。

これの原因は何ですか?どうすれば解決できますか?

私のコード:

    //form level objects
    private BindingList<Person> persons;
    private BindingSource pSource=new BindingSource();

    private void Form1_Load(object sender, EventArgs e)
    {
        _context=new TestEFmodelContainer();
        var p = _context.PersonSet.ToList();
        persons = new BindingList<Person>(p); //getting bindinglist
        persons.AllowEdit = true;
        persons.AllowNew = true;

        pSource.DataSource = persons;
        pSource.AllowNew = true;

        personDataGridView.DataSource = pSource;
    }

    //"Save changes to DB" button
    private void SaveChangesToDB_Click(object sender, EventArgs e)
    {
        _context.SaveChanges();
    }
4

1 に答える 1

3

私はついにこれを解決することができました!

これらの行の代わりに:

    persons = new BindingList<Person>(p); //getting bindinglist
    ...
    pSource.DataSource = persons;

私はこの行を使用します:

    pSource.DataSource = _context.Persons.Local.ToBindingList();

Persons は、私の DbContext からの DbSet<> です

そして、私が理解できなかったもう1つのことは、派生したEFモデルクラスでこれを機能させようとしたことでした.BasePersonクラスとDerivedPersonクラスがあるとしましょう。EF は、BasePerson (OfType メソッドを介してアクセスできるすべての派生インスタンスを含む) に対してのみ DbSet を作成します。これらの派生クラスの .Local.ToBindingList を機能させることができませんでした。

派生クラスの秘訣は、これらの派生クラスの DbSet を DbContext クラスに追加することでした。

于 2013-10-20T15:16:32.973 に答える