Error al acceder a base de datos - C#

Iniciado por ikkaku, 23 Enero 2015, 10:43 AM

0 Miembros y 1 Visitante están viendo este tema.

ikkaku

Hola a todos.
He puesto la misma duda en el foro de Base de Datos pero ahora dudo si deberia estar ahi o aqui.
Os comento, estoy programando una aplicacion HMI para el control de un automata y a la hora de acceder a la base de datos el programa se me para y me salta el siguiente error.

CitarSe produjo una excepción de tipo 'System.NotSupportedException' en EntityFramework.dll
pero no se controló en el código del usuario

Información adicional:
CitarData binding directly to a store query (DbSet, DbQuery, DbSqlQuery, DbRawSqlQuery) is not supported. Instead populate a DbSet with data, for example by calling Load on the DbSet, and then bind to local data. For WPF bind to DbSet.Local. For WinForms bind to DbSet.Local.ToBindingList(). For ASP.NET WebForms you can bind to the result of calling ToList() on the query or use Model Binding, for more information see"

El codigo es el siguiente:
Código (csharp) [Seleccionar]
private MainWindow mainWindow;
private basedatosEntities bbdd;
private element producto;

public PageSeleccion()
{
InitializeComponent();
bbdd = DataBaseFactory.GetbasedatosDatabaseEntities();
this.productoList.ItemsSource = bbdd.element; <----- Aqui me salta el error
this.producto = null;
}




basedatos es mi base de datos y element es una tabla de la base.

Me gustaria que me ayudarais a resolver este problema.

Gracias.




[MOD]: Usa las etiquetas adecuadas para insertar código o citas.

ikkaku

#1
Perdoname, pensaba que las habia puesto pero me equivoque. Tal y como esta ahora es correcto no ?

Edit: El proyecto usa una version de .NET Framework de destino 4.5.1 no se si estara relacionado con el problema

Eleкtro

#2
Hola

No tiene nada que ver con la versión objetivo de .Net Framework, en la información que has mostrado, el error se explica por si mismo, y también la solución :P

No puedes enlazar los datos de la query directamente, así que debes generar una colección local.

Prueba una de estas simples modificaciones dependiendo de la tecnología que estés usando (WinForms / WPF / ASP.Net, como se especifica en el error de arriba):
Código (csharp) [Seleccionar]
this.productoList.ItemsSource = bbdd.element.ToList;
Código (csharp) [Seleccionar]
this.productoList.ItemsSource = bbdd.element.ToBindingList;

o tal vez:
Código (csharp) [Seleccionar]
this.productoList.ItemsSource = (from item in bbdd select).ToList();

Saludos








ikkaku

#3
Pero en cambio en otro programa similar que tengo con las mismas lineas de codigo no me salta ningun error y hace lo que deberia hacer.

Código (csharp) [Seleccionar]

database = DataBaseFactory.GetlantaDatabaseEntities();
this.productoList.ItemsSource = database.producto;



Código (csharp) [Seleccionar]

 private void ButtonNewProductClick(object sender, System.Windows.RoutedEventArgs e)
       {
         

           ObjectSet<producto> listProd = (ObjectSet<producto>) this.productoList.ItemsSource;
           producto prod = listProd.CreateObject();
           prod.imagen = null;
           prod.mosaico = null;
           prod.id_producto = -1;

           if (selectedProduct != null)
           {
               prod.alto = selectedProduct.alto;
               prod.ancho = selectedProduct.ancho;
               prod.largo = selectedProduct.largo;
           }
           else
           {
               prod.alto = Systema.MIN_L;
               prod.ancho = Systema.MIN_L;
               prod.largo = Systema.MIN_L;
           }

           //obtengo un nombre unico
           String nombre = "PRODUCTO";
           int i=0;
           foreach (producto p in listProd)
           {
               try
               {
                   int aux = int.Parse(p.nombre.Substring(8));
                   if (i <= aux)
                   {
                       i = aux + 1;
                   }
               }
               catch (Exception)
               { }

               if (String.CompareOrdinal(p.nombre.ToUpper(), (nombre + i)) == 0)
               {
                   i++;
               }
           }

           
           prod.nombre = nombre + i;
           listProd.AddObject(prod);            
           database.SaveChanges();

           database = DataBaseFactory.GetUpdatedlantaDatabaseEntities();
           this.productoList.ItemsSource = database.producto;
           


           selectedProduct = prod;            
           this.mosaicoList.ItemsSource = selectedProduct.mosaico;
           this.selectedMosaico = null;

           this.productoNombre.Text = selectedProduct.nombre;
           this.alto.Text = selectedProduct.alto.ToString();
           this.ancho.Text = selectedProduct.ancho.ToString();
           this.largo.Text = selectedProduct.largo.ToString();

           this.sliderAlto.Value = selectedProduct.alto;
           this.sliderAncho.Value = selectedProduct.ancho;
           this.sliderLargo.Value = selectedProduct.largo;


Ese codigo es para crear nuevos elementos en la base de datos y que aparezcan en un DataGrid y es lo que quiero hacer en el nuevo codigo.

Esta es la parte de crear un nuevo producto del nuevo codido:

Código (csharp) [Seleccionar]

       private void ButtonNewProductClick(object sender, RoutedEventArgs e)
       {
           ObjectSet<element> listProd = (ObjectSet<element>) this.productoList.ItemsSource;
       }


En esa linea si pongo el acceso a la coleccion como .ToList() me dice lo siguiente:

CitarInformación adicional: No se puede convertir un objeto de tipo 'System.Collections.Generic.List`1[HMI_2.element]' al tipo 'System.Data.Objects.ObjectSet`1[HMI_2.element]'

Edit: Acabo de ver que el primer codigo ,el que funciona, tiene esta linea en el .XAML dentro de Page.Resources no se si tendra que ver:
Código (csharp) [Seleccionar]
<CollectionViewSource x:Key="productoViewSource" d:DesignSource="{d:DesignInstance my:producto, CreateList=True}" />