« - »

Linq to SharePoint: Error “La conversión especificada no es válida”

Jueves, 12 de abril de 2012

Error “Specific cast is not valid”

Para poder trabajar con Linq to SharePoint el primero paso es generar las clases de entidad de nuestro sitio. Para ello, tenemos la herramienta de línea de comandos SPMetal que viene con cualquier de las versiones de SharePoint 2010. Para más detalles sobre su uso podéis ver la documentación de MSDN: http://msdn.microsoft.com/es-es/library/ee538255.aspx

Hoy al hacer una consulta simple de una lista de SharePoint me he encontrado con el error “La conversión especificada no es válida” (Specific cast is not valid). Había generado las clases con el SPMetal con la configuración por defecto y cualquier intento de usar la lista me daba el error del título.

Tras buscar, descubro que parece que es un bug del SPMetal al encontrarse con una columna del tipo “WorkflowStatus” que se autogeneran cuando se añade un flujo de trabajo a una lista. Según la documentación de MSDN, este tipo de columna debería generarse en las clases de entidad del tipo Object (http://msdn.microsoft.com/es-es/library/ee536245.aspx) pero el SPMetal las genera del tipo Nullable<int>.

En mi caso concreto, el archivo .cs con las clases generadas contenía:

   1: private System.Nullable<int> _distribucionCorreo;

   2:  

   3:  

   4: [Microsoft.SharePoint.Linq.ColumnAttribute(Name="Distribu", Storage="_distribucionCorreo", ReadOnly=true, FieldType="WorkflowStatus")]

   5:     public System.Nullable<int> DistribucionCorreo {

   6:         get {

   7:             return this._distribucionCorreo;

   8:         }

   9:         set {

  10:             if ((value != this._distribucionCorreo)) {

  11:                 this.OnPropertyChanging("DistribucionCorreo", this._distribucionCorreo);

  12:                 this._distribucionCorreo = value;

  13:                 this.OnPropertyChanged("DistribucionCorreo");

  14:             }

  15:         }

  16:     } 

Solución A

La solución Quick&Dirty es, una vez generadas las clases con SPMetal, ir a las propiedades problemáticas y cambiar los tipos Nullable<int>  por tipo Object como indica la documentación de MSDN que debería ser.

Solución B

Una solución más elegante sería crear un archivo de configuración del comando SPMetal en el que indicamos que excluya la columna del tipo WorkflowStatus de las clases generadas. Por ejemplo:

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <Web xmlns="http://schemas.microsoft.com/SharePoint/2009/spmetal">

   3:   <List Name="Registro de entrada">

   4:     <ContentType Name="Elemento" Class="RegistroDeEntradaElemento">

   5:       <ExcludeColumn Name="Distribu"/>

   6:     </ContentType>

   7:   </List>

   8: </Web>

 

De esta manera, al ejecutarse el SPMetal ya no nos generará estas columnas evitando el error.

Referencias:


Dejar una respuesta

Dark traducido por Reproduccion Asistida Inspirado en: Bloggerlounge & Arquitectura