簡體   English   中英

嘗試將Datagridview與實體框架綁定時出錯?

[英]Error trying to bind Datagridview with Entity Framework?

模型:

碼:

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

錯誤:

我是Entity Framework的新手,我想知道如何使用它,因為我可以看到使用它的優點。 我想要做的只是將Productos數據集綁定到datagrid,但它會拋出異常,我真的很感謝你的幫助。

問題是您的Producto類不僅具有簡單屬性( stringint ),還具有指向producto所關聯的其他類的導航屬性。

在這種特殊情況下,錯誤顯示producto有一個DetalleCotizacione列表(無論它是什么)。 從EF返回的producto的代理類具有延遲加載的屬性,這意味着在某些代碼要求之前不會評估該屬性。

現在是棘手的部分。 您的客戶端代碼要求提供列表

ctx.Productos.ToList();

該列表將填充productos,其中所有簡單屬性( stringint )都已初始化,並且所有延遲加載屬性都不是。

然后你處理數據上下文。

現在數據網格綁定器檢查(通過反射)您的對象並找到許多公共屬性,包括初始化的那些( stringint )和不屬於導航屬性的屬性。 網格為所有公共屬性創建列,並開始填充行。 然后它會詢問 producto的所有公共字段的 ,並且在導航屬性的情況下 - 它會失敗,因為您的上下文已經被處理 (在using塊的末尾)。

有兩種解決方法:

  1. 以顯式方式初始化網格列的列表,而不是依賴於自動生成列。 這樣,您可以為不是延遲加載的導航屬性的所有屬性創建列。

  2. 將您的productos投射到您想要的任何匿名類型,從而在上下文所在的塊內顯式加載簡單和導航屬性:

     using (var ctx = new AefesaEntities1()) { dataGridView1.DataSource = ctx.Productos .Select( p => new { id = p.ID, whatever = p.Whatever, lazy = p.Lazy1, etc. } .ToList(); } 

你將獲得實體“Productos”的所有成員,包括“Cotizaciones”和“Detallecotizacionnes”。 嘗試指定要分配給datagrid列的成員。

例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM