# Signum Framework

Signum Framework es un framework ORM Open Source creado por una empresa española en C# orientado al desarrollo de aplicaciones sobre la tecnología .Net de Microsoft, con un visión centrada en las entidades, de manera que es el modelo de datos el que determina el esquema de la base de datos. Como base de datos sólo está soportado MS SQL Server.
Signum Framework se distribuye bajo licencia LGPL.

## Características
### Elementos de Signum Framework

Signum Framework está compuesto por los siguientes ensamblados:
* Signum.Entities - Las clases base necesarias para generar las entidades de datos.
* Signum.Engine - El motor ORM con un proveedor LINQ completo.
* Signum.Utilities - Conjunto de utilidades y herramientas.
* Signum.Services - Interfaces base del servicio WCF
* Signum.Windows - Controles base para manipular entidades

### Entidades primero

La filosofía centrada en las entidades propicia que el esquema de datos se genere automáticamente a partir de los objetos de código, evitando mapear los campos entre la base de datos y las entidades a través de archivos de configuración. De esta manera se trata de que se detecten las posibles incidencias en tiempo de compilación para todas las clases (tanto de datos como de lógica).
Por otro lado, esto mismo impide que Signum Framework se adapte bien a proyectos en los que existe una base de datos anterior que se debe preservar, ya que, a diferencia de otros frameworks, la base de datos se genera a partir del código y no a la inversa.
Dada la importancia que se concede a las entidades como núcleo de las aplicaciones, Signum Framework provee un pequeño grupo de clases base y primitivas que permiten modelar los objetos de una manera modular y reusable, evitando la redundancia y asegurando la integridad de los objetos, tanto en lógica como una vez persistidos en base de datos. Esto mismo (al tener que heredar las entidades desde alguna de estas clases base) hace que Signum Framework no soporte POCO (Plain Old C# Object).

### Generación del esquema

La base de datos relacional se genera automáticamente a partir de las entidades utilizando un mapeado 1 a 1 desde las entidades a las tablas, de manera que cada entidad independiente tiene su propia tabla y cada campo de la entidad su propia columna. Las entidades que son embebidas (EmbeddedEntity) no tienen una tabla propia, sino que sus campos se guardan como columnas en la tabla de la entidad a la que pertenecen. Se utilizan tablas relacionales para las colecciones, lo que permite las relaciones N a N.
Para permitir realizar modificaciones sobre los datos sin tener que regenerar la base de datos cada vez, se puede realizar una sincronización entre las entidades y la base de datos existente, en la que el motor generará un archivo de script SQL con las modificaciones necesarias para actualizar el esquema.

### Herencia de entidades

Aunque Signum Framework utiliza un sistema de "tabla por clase concreta", en el que se crea una tabla una por cada uno de los tipos concretos, permite implementar el concepto de herencia utilizando relaciones polimórficas, que cuentan con una clave externa que admite valores nulos por cada posible implementación.

### Interfaz de usuario y WCF

Signum.Windows ofrece controles WPF básicos que aprovechan la homogeneidad de las entidades para implementar un comportamiento automático. Estos controles simplifican el desarrollo de las vistas de las entidades de una aplicación.
Para la comunicación entre los clientes y el servidor se utilizan contratos WCF que permiten la compartición de tipos. Esto facilita reutilizar las reglas de validación de las entidades en el cliente, eliminando la redundancia.
La utilización de objetos Lazy permite trabajar con "huellas" de una entidad, conociendo su ToString y su identificador, pero sin recuperar la entidad completa hasta que sea necesario, minimizando así la carga de trabajo y la transferencia de datos, aumentando considerablemente el rendimiento de las aplicaciones.

### LINQ

Signum Framework tiene un proveedor LINQ completo, de manera que todas las operaciones se ejecutan en LINQ, e internamente el motor las traduce a SQL. Algunas de las características del proveedor de LINQ son las siguientes:
* Soporta la sentencia JOIN.
* Soporta valores booleanos en cualquier parte de la consulta.
* Soporta GroupJoin y DefaultIfEmpty.
* Soporta Group By en C# y VB.NET con agregados múltiples.
* Soporta el uso de let en las consultas.
* Maneja la construcción de objetos en memoria dentro de consultas, así como llamadas a métodos en memoria.
* Soporta tipos nulables y conversiones implícitas.
* Ofrece emulación nativa de funciones SQL.
* Soporta operaciones de tipo SelectMany.
Debido a algunas de las funcionalidades que soporta (en concreto las funciones CROSS APPLY / OUTER APPLY), actualmente las bases de datos soportadas por Signum Framework se limitan a SQL Server 2005 y SQL Server 2008 (tanto en las versiones Express como en las versiones de pago).
La principal diferencia entre el proveedor de LINQ de Signum Framework y otros proveedores es que no depende de un contexto explícito que depende del esquema actual de la base de datos, lo que permite escribir lógica de negocio reutilizable.

## Historia

* 2004 - Primera versión de un motor ORM basado en los principios de reutilización y centrado en entidades.
* 2007 - Segunda versión del motor ORM, incluyendo el Gestor de Operaciones y Procesos.
* 2008 - Signum Framework 1.0 Beta 1, incluyendo las funcionalidades de ORM, WPF y LINQ.
* 2009 - Release de Signum Framework 1.0 en Codeplex.
* 2010 - Signum Framework 2.0 Beta 1, con soporte para .Net Framework 4 y ASP.Net MVC 2.0 (versión interna).
* 2011 - Signum Framework 2.0 Beta 2, con soporte para ASP.Net MVC 3.0 (versión interna).
* 2011 - Release de Signum Framework 2.0, incluyendo soporte para .Net Framework 4 y ASP.Net MVC 3.0