尝试将Datagridview与实体框架绑定时出错?

时间:2014-01-04 18:54:40

标签: c# winforms entity-framework data-binding

型号:

http://i44.tinypic.com/2q8njhx.jpg

代码:

  public partial class frmCotizaciones : Form
{
    public frmCotizaciones()
    {
        InitializeComponent();
        using (var ctx = new AefesaEntities1())
        {
            dataGridView1.DataSource = ctx.Productos.ToList();
        }
    }
}

错误:

http://oi41.tinypic.com/2l9kr38.jpg

我是Entity Framework的新手,我想知道如何使用它,因为我可以看到使用它的优点。我想要做的只是将Productos数据集绑定到datagrid,但它会抛出异常,我真的很感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

问题在于,您的Producto类不仅具有简单属性(stringint),还包含指向producto所关联的其他类的导航属性。

在这种特殊情况下,错误显示producto有一个DetalleCotizacione列表(无论它是什么)。从EF返回的producto的代理类具有延迟加载属性,这意味着在某些代码要求之前不会对该属性进行求值。

现在是棘手的部分。您的客户端代码要求提供列表

ctx.Productos.ToList();

该列表将使用productos填充,其中所有简单属性(stringint)都已初始化,并且所有延迟加载属性均未初始化。

然后你处理数据上下文。

现在数据网格绑定器检查(通过反射)您的对象并找到许多公共属性,包括初始化的属性(stringint)和不属于导航属性的属性。网格为所有公共属性创建列,并开始填充行。然后要求producto的所有公共字段的值,并且在导航属性的情况下 - 它失败,因为您的上下文已经处理(在{{1的末尾)阻止)。

有两种解决方法:

  1. 以显式方式初始化网格列,而不是依赖于自动生成列。这样,您就可以为延迟加载的导航属性的所有属性创建列。

  2. 将您的productos投射到您想要的任何匿名类型,从而明确加载简单和导航属性在块内,其中上下文存在:

    using

答案 1 :(得分:1)

您将获得实体“Productos”的所有成员,包括“Cotizaciones”和“Detallecotizacionnes”。 尝试指定要分配给datagrid列的成员。

示例:

using (var ctx = new AefesaEntities1())
        {
           dataGridView1.DataSource = ctx.Productos.select(p=>new{p.IdProducto ,p.Descripcion ,p.PrecioActual}).ToList();
        }