1

WinFormsでEntityFramework5.0を使用しており、MSDNのEntityFrameworkWebサイトにあるWinFormsを使用したデータバインディングのチュートリアルに従っています。ソートされた順序を保存できるように、CategoryクラスをSortIdを持つように変更しました。

public class Category
{
    private readonly ObservableListSource<Product> _products =
            new ObservableListSource<Product>();

    public Category(int pSortId = 0)
    {
        Name = "New Category";
        SortId = pSortId;
    }

    public int CategoryId { get; set; }
    public string Name { get; set; }
    public int SortId { get; set; }
    public virtual ObservableListSource<Product> Products { get { return _products; } }
}

ただし、SortIdを追加した後、アプリケーションはDataGridViewでのカテゴリの表示を停止しました。デバッガーをステップ実行し、OnLoadメソッドにデバッグステートメントを追加すると、_context.Categories.Load()が呼び出されると、そのメソッドの実行が途中で停止することがわかりました。つまり、categoryBindingSourceにデータソースが割り当てられることはありません。

_context.Categories.Load()はここで呼び出されます(上記のチュートリアルとまったく同じです)

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        _context = new ProductContext();
        _context.Categories.Load();
        this.categoryBindingSource.DataSource =
            _context.Categories.Local.ToBindingList();
    }

質問: Loadメソッドがこれを行う理由を誰かが知っていますか?(これはDbExtensions.Loadです

必要に応じて、ProductContextクラス(チュートリアルから変更されていない)は次のとおりです。

    public class ProductContext : DbContext
    {
        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }
    }
4

1 に答える 1

1

これが私の解決策です。まだ答えとしてマークしません。これは、誰かが舞台裏で何が起こっているかについて詳しく説明できるとより役立つからです。

要するに、Visual Studio にすべての例外を中断するように指示し ([デバッグ] > [例外] > [スローされたものをすべてチェック])、外部コードのどこかで InvalidOperationException がスローされ、「クラス 'EFWinForms.Category' にはパラメーターなしのコンストラクターがありません」というメッセージが表示されました。

このアドバイスを使用して、Category クラスのコンストラクターを次のように分割します。

public Category() : this(0) { }

public Category(int pSortId)
{
    Name = "New Category";
    SortId = pSortId;
}

私の仮定は、DbExtensions.Load メソッドがその例外をキャッチし、スレッドを強制終了したことです。これはかなり奇妙に思えますが、それを証明する方法はありません。

于 2013-01-16T18:08:16.513 に答える