型号:
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,但它会抛出异常,我真的很感谢你的帮助。
答案 0 :(得分:2)
问题在于,您的Producto
类不仅具有简单属性(string
,int
),还包含指向producto所关联的其他类的导航属性。
在这种特殊情况下,错误显示producto有一个DetalleCotizacione
列表(无论它是什么)。从EF返回的producto的代理类具有延迟加载属性,这意味着在某些代码要求之前不会对该属性进行求值。
现在是棘手的部分。您的客户端代码要求提供列表
ctx.Productos.ToList();
该列表将使用productos填充,其中所有简单属性(string
,int
)都已初始化,并且所有延迟加载属性均未初始化。
然后你处理数据上下文。
现在数据网格绑定器检查(通过反射)您的对象并找到许多公共属性,包括初始化的属性(string
,int
)和不属于导航属性的属性。网格为所有公共属性创建列,并开始填充行。然后要求producto的所有公共字段的值,并且在导航属性的情况下 - 它失败,因为您的上下文已经处理(在{{1的末尾)阻止)。
有两种解决方法:
以显式方式初始化网格列,而不是依赖于自动生成列。这样,您就可以为不延迟加载的导航属性的所有属性创建列。
将您的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();
}