1

我正在使用带有 WinForms 的 Entity Framework 5.0,并且我只是按照 MSDN 的 Entity Framework 网站上的Databinding with 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 中断任何异常(Debug > Exceptions > Check all under throwed),并在外部代码的某处发现了 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 回答