none
La instancia de ObjectContext se ha eliminado. RRS feed

  • Pregunta

  • Hola:

    Estoy haciendo pruebas con Ado.net entity data model, y he puesto el siguiente código, al abrír el formulario me carga bien, pero cuando le doy a maximizar me sale el siguiente error:

    La instancia de ObjectContext se ha eliminado y ya no se puede usar para operaciones que requieren una conexión.

    Supongo que es porque está todo declarado dentro de Load, pero donde  hay que declararlo y como para que no salga ningún error.

    Si alguien tiene algún ejemplo (de cargar, alta, modificación y baja) o sabe de algún sitio donde lo haya, estaría muy agradecido. Ya que siempre he hecho cosillas creando manualmente las entidades y esta forma me ahorraría bastante tiempo y escritura de código.


    Imports PruebaBaseDatos.NorthwindEntities
    Public Class Form1
    
    
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Try
                Using context As New NorthwindEntities()
                    Dim productos = From p In context.Products
                    
                    Me.DataGridView1.DataSource = productos
                End Using
            Catch ex As Exception
                MsgBox(ex)
            End Try
            
    
        End Sub
    End Class
    

    Un Saludo.

    Juan Carlos.

    lunes, 18 de junio de 2012 17:05

Respuestas

  •    en System.Data.Objects.DataClasses.EntityReference`1.get_Value()
       en PruebaBaseDatos.Product.get_Category() en C:\Users\juan carlos\AppData\Local\Temporary Projects\PruebaBaseDatos\BDNorthwind.Designer.vb:línea 591

    Hola Juan Carlos,

    pues el Stacktrace si te esta señalando donde esta el error, estas dos lineas que comento son las del error, porque?, la clase product tiene una propiedad de referencia o navegación llamada "Category".

    seguro en el DataGridView tienes una columna donde haces referencia a esta clase "Category" y seguro no esta visible en el DatGridView cuando se cargan los datos y se muesta el formulario tal ves por la cantidad de columnas que este tenga y cuando lo maximizas se muestra esta columna, así que al mostrarse la columna intenta obtener el valor para Category y como el contexto ya no existe te marca el error que detallas.

    así que lo que podrias hacer es crear una variable a nivel del formulario la cual seria tipo "NorthwindEntities" para que esta exista mientras el formulario exista.

    ejemplo:

    Private context As NorthwindEntities
    
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Try
            Me.context = New NorthwindEntities()
            Dim productos = From p In Me.context.Products
            Me.DataGridView1.DataSource = productos
        Catch ex As Exception
            MsgBox(ex)
        End Try
    End Sub

    de esta manera el contexto existiria despues de ejecutarse el evento Load y cuando maximizes el formulario o hagas scroll en el DataGridview no te marcara error.

    espero te sea de ayuda.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Marcado como respuesta elturle miércoles, 20 de junio de 2012 13:28
    martes, 19 de junio de 2012 13:43
  • Muchas Gracias Marvin.

    Poniéndolo como me indicas sale perfectamente.  Y como me comentas en la última columna muestra Category, que como bien indicas es la propiedad de navegación entre la tabla productos y la tabla categorías. Entonces no entiendo como muestra esta columna si no es ningún campo de la tabla y siempre aparece el mismo valor en todos los registros PruebaBaseDatos.Category. Si me puedes decir porque muestra este vínculo al no ser ningún campo te lo agradecería.

    Un Saludo.

    Juan Carlos

    si tu no has agregado las columnas en tiempo de diseño y has dejado que al asociar la propiedad DataSource del DataGridView a la lista de productos se agreguen automaticamente las columnas, la propiedad "Category" no es una relacción 1 a muchos por ende creo que el DataGridView la considera como una propiedad más y agrega la columna para esta propiedad.

    si no quieres que aparesca tendras que agregar manuamente en el diseñador las columnas y por codigo cambiar la propiedad "AutoGenerateColumns" a "False".

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Marcado como respuesta elturle miércoles, 20 de junio de 2012 13:29
    martes, 19 de junio de 2012 18:34

Todas las respuestas

  • La instancia de ObjectContext se ha eliminado y ya no se puede usar para operaciones que requieren una conexión.

    en que liena se produce este problema

    proque no me suena que sea en el Load, pareciera uan operacion de actualizacion


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 18 de junio de 2012 19:52
  • Hola Leandro:

    El load lo carga bien, pero después de cargar cuando maximizo el formulario me sale ese mensaje.

    Un Saludo.

    Juan Carlos

    lunes, 18 de junio de 2012 20:23
  • que evento defines en el formulario ?

    que dice el stacktrace del exception cuando falla, para determinar donde se proruce el problema


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 18 de junio de 2012 20:39
  • Esto es lo que pone en el stacktrace:

       en System.Data.Objects.ObjectContext.EnsureConnection()
       en System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
       en System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)
       en System.Data.Objects.DataClasses.EntityReference`1.Load(MergeOption mergeOption)
       en System.Data.Objects.DataClasses.RelatedEnd.Load()
       en System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad()
       en System.Data.Objects.DataClasses.EntityReference`1.get_Value()
       en PruebaBaseDatos.Product.get_Category() en C:\Users\juan carlos\AppData\Local\Temporary Projects\PruebaBaseDatos\BDNorthwind.Designer.vb:línea 591

    Y en la línea 591 hay lo siguiente:

    Return CType(Me, IEntityWithRelationships).RelationshipManager.GetRelatedReference(Of Category)("NorthwindModel.FK_Products_Categories", "Categories").Value

    lunes, 18 de junio de 2012 21:01
  • mm que macana no aporta mucho mas el stacktrace

    lo que me no me cierra es que se produzca cuandos e maximiza, o sea alguna operacion se debe estar lanzando que realiza un acceso a la db por medio de EF para que genere el problema

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 18 de junio de 2012 21:11
  • Ahora en vez de aparecer el error cuando maximizo, aparece cuando llevo el scrollbar horizontal del datagridview al final del lado derecho de la ventana.

    Un Saludo.

    Juan carlos

    lunes, 18 de junio de 2012 22:25
  •    en System.Data.Objects.DataClasses.EntityReference`1.get_Value()
       en PruebaBaseDatos.Product.get_Category() en C:\Users\juan carlos\AppData\Local\Temporary Projects\PruebaBaseDatos\BDNorthwind.Designer.vb:línea 591

    Hola Juan Carlos,

    pues el Stacktrace si te esta señalando donde esta el error, estas dos lineas que comento son las del error, porque?, la clase product tiene una propiedad de referencia o navegación llamada "Category".

    seguro en el DataGridView tienes una columna donde haces referencia a esta clase "Category" y seguro no esta visible en el DatGridView cuando se cargan los datos y se muesta el formulario tal ves por la cantidad de columnas que este tenga y cuando lo maximizas se muestra esta columna, así que al mostrarse la columna intenta obtener el valor para Category y como el contexto ya no existe te marca el error que detallas.

    así que lo que podrias hacer es crear una variable a nivel del formulario la cual seria tipo "NorthwindEntities" para que esta exista mientras el formulario exista.

    ejemplo:

    Private context As NorthwindEntities
    
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Try
            Me.context = New NorthwindEntities()
            Dim productos = From p In Me.context.Products
            Me.DataGridView1.DataSource = productos
        Catch ex As Exception
            MsgBox(ex)
        End Try
    End Sub

    de esta manera el contexto existiria despues de ejecutarse el evento Load y cuando maximizes el formulario o hagas scroll en el DataGridview no te marcara error.

    espero te sea de ayuda.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Marcado como respuesta elturle miércoles, 20 de junio de 2012 13:28
    martes, 19 de junio de 2012 13:43
  • Muchas Gracias Marvin.

    Poniéndolo como me indicas sale perfectamente.  Y como me comentas en la última columna muestra Category, que como bien indicas es la propiedad de navegación entre la tabla productos y la tabla categorías. Entonces no entiendo como muestra esta columna si no es ningún campo de la tabla y siempre aparece el mismo valor en todos los registros PruebaBaseDatos.Category. Si me puedes decir porque muestra este vínculo al no ser ningún campo te lo agradecería.

    Un Saludo.

    Juan Carlos

    martes, 19 de junio de 2012 17:23
  • Muchas Gracias Marvin.

    Poniéndolo como me indicas sale perfectamente.  Y como me comentas en la última columna muestra Category, que como bien indicas es la propiedad de navegación entre la tabla productos y la tabla categorías. Entonces no entiendo como muestra esta columna si no es ningún campo de la tabla y siempre aparece el mismo valor en todos los registros PruebaBaseDatos.Category. Si me puedes decir porque muestra este vínculo al no ser ningún campo te lo agradecería.

    Un Saludo.

    Juan Carlos

    si tu no has agregado las columnas en tiempo de diseño y has dejado que al asociar la propiedad DataSource del DataGridView a la lista de productos se agreguen automaticamente las columnas, la propiedad "Category" no es una relacción 1 a muchos por ende creo que el DataGridView la considera como una propiedad más y agrega la columna para esta propiedad.

    si no quieres que aparesca tendras que agregar manuamente en el diseñador las columnas y por codigo cambiar la propiedad "AutoGenerateColumns" a "False".

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Marcado como respuesta elturle miércoles, 20 de junio de 2012 13:29
    martes, 19 de junio de 2012 18:34
  • en caso quieras que aparesca la "Descripcion" de la "Categoria" puedes sobre escribir el metodo ToString() de la clase para que devuelva la descripción en lugar de que aparesca "PruebaBaseDatos.Category", o utilizar ICustomTypeDescriptor para poder hacer referencia de esta manera ejemplo: "Category.Description".

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 19 de junio de 2012 18:39