2012-10-06 26 views
9

¿Cómo funciona ServiceStack OrmLite gestionando columnas predeterminadas y calculadas?ServiceStack OrmLite - Manejo de columnas predeterminadas y calculadas

Específicamente Estoy consiguiendo el error

The column "PointsAvailable" cannot be modified because it is either a computed column or is the result of a UNION operator. 

Esta columna está configurada como una columna calculada en una base de datos SQL Server 2008.

OrmLite parece hacer algo con las columnas calculadas, ya que puede agregar el atributo '[ServiceStack.DataAnnotations.Compute]' a una propiedad en un modelo.

Al ingresar al código, se llama a la función 'ToInsertRowStatement' en 'OrmLiteDialetBase.cs'. Mientras que esa función comprueba si está configurada la propiedad AutoIncrement, no está comprobando si está establecida la propiedad IsComputed.

No sé si esto es un error o si solo lo estoy usando mal.

+0

Intentaría agregar un cheque para IsComputed. Si eso soluciona el problema, crea una solicitud de extracción en github con la corrección de errores. ServiceStack es un programa bien diseñado, por lo que es poco probable que haya varios lugares donde pueda realizarse esta verificación. – theMayer

+0

Para aclarar mi comentario anterior, debe hacer esto en el código fuente, luego recompilar el binario. No debería tomar más de unos 5 minutos. – theMayer

Respuesta

0

Sobreescribo la creación de una vista con las columnas relevantes (excluyendo las columnas calculadas) de la tabla y trabajo desde la vista en su lugar. De esta forma evitará referencias a columnas calculadas no deseadas. Las vistas simples se pueden tratar de la misma manera que las tablas normales con respecto a insertar, eliminar, actualizar y la mayoría de los demás aspectos.

+0

Eso es un poco ... hacky. Esperaba que hubiera alguna forma incorporada en ServiceStack para hacerlo. – John

+0

@john parece que actualmente estás experimentando algún tipo de error en ServiceStack OrmLite. Como no puedo arreglar su herramienta, una solución alternativa debería ser la segunda mejor, esta es mi sobrecarga a una solución alternativa. De lo contrario, puede ponerse en contacto con las personas que crearon OrmLite y solicitar una solución. –

6

Para mis columnas calculadas que sólo se computan en la capa de servicio, SQL no sabe nada acerca de ellos, por lo que utiliza una combinación de los siguientes atributos en el modelo servicestack:

[Compute, ServiceStack.DataAnnotations.Ignore] 
public List<MyModel> MyList {get;set;} 

La diferencia parece ser la "Ignorar" el atributo que insistía en tener su espacio de nombres adjunto? Con estos en su lugar, se ejecutan mis consultas básicas, de lo contrario SQL se queja de que las columnas no existen, ¡con razón!

Puede, como sugiere t-clausen.dk, utilizar un filtro SQL al pasar específicamente una cadena de comandos SQL CommandText con todos los nombres de columna que desee, pero creo que esto abre un problema de mantenimiento.

En cuanto a una corrección de error que se ve en la base de datos, parece que el SQL se genera por proveedor por un método "toSqlString()" o similar. Así que probablemente haya algunos puntos para prestar atención a ...

EDITAR: Simplemente es el atributo Ignorar lo que hace el trabajo. Desde la fuente:

/// IgnoreAttribute 
/// Use to indicate that a property is not a field in the table 
/// properties with this attribute are ignored when building sql sentences 

También existe la opción de utilizar un ALIAS que no he explorado.

Cuestiones relacionadas