14 enero 2012

BUSINESS CONNECTIVITY SERVICES - SharePoint 2010

Innovar Tecnologías ©

DESARROLLANDO UN MODELO DE DATOS CUSTOM .NET DESDE EL PRINCIPIO

- En este ejemplo, iremos paso a paso en la implementación de un modelo de datos que publique una lista de marcas de ordenadores leída desde una base de datos, relacionada (asociada en términos BCS) con una lista de ordenadores de cada marca; este ejemplo leerá la base de datos utilizando LINQ to SQL.

1. Iniciando el proyecto

- Crea un nuevo proyecto en Visual Studio - SharePoint 2010 tipo Business Data Connectivity Model (Conexión a datos profesionales)
- Por definición este tipo de soluciones es full-trust y sólo permite despliegue a nivel de granja
- Aparece una ventana con un diseñador de modelos preconfigurado describiendo al archivo .bdcm, con una hipotética Entity1, junto con las clases relacionadas Entity1.cs y EntityService.cs
- Borra la Entity1 del modelo así como sus dos ficheros .cs relacionados.
- Para hacer desplegable el proyecto, desde este momento necesitamos configurar la feature que implementa el modelo de la siguiente forma, indicando la SiteUrl en las propiedades:

<?xml version="1.0" encoding="utf-8" ?>
    <Feature Scope="Farm" Id="{932263B8-BDF5-4415-ABAB-479C7B29CEE0}"
             xmlns="http://schemas.microsoft.com/sharepoint/">
      <Properties>
         <Property Key='SiteUrl' Value='http://sharepointserver:7822'>
         <Property Key='GloballyAvailable' Value='true'>
      </Properties>
    </Feature>

- Añade un modelo de clases LINQ to SQL al proyecto y define un enlaces a las tablas Marcas y Ordenadores definidas en la base de datos SQL Server objetivo. Configura las propiedades de los campos de ambas tablas en el modelo .dbml para dar soporte a concurrencia optimista (Update Check = Never)



- Renombra el modelo BCS BdcModel1 a un nombre más consistente, así como su fichero .bdcm relacionado al mismo nombre
- Añade una nueva entidad al modelo desde el Cuadro de Herramientas propio de BDCM, y ponle el nombre EntityMarcas. El diseñador generará por usted el fichero relacionado EntityMarcasService.cs



- Añade un nuevo identifier a la entidad, y añade también dos métodos, llamados ReadList y ReadItem



- Ahora necesitas configurar los dos métodos. El método ReadList corresponde al método Finder, mientras que el método ReadItem corresponde al método SpecificFinder

- Empecemos con el método ReadList. Selecciona el método en el diseñador y muestra la ventana BDC Method Details. Para añadir un nuevo parámetro, selecciona la sección Parameters y pulsa Agregar Parámetro



- Nombra al nuevo parámetro listaMarcas, asígnale dirección Return, y selecciona la columna listaMarcasTypeDescriptor para editar sus propiedades como se indica a continuación:
• Is Collection = true
• Despliega el valor de la propiedad TypeName para marcar la opción Is Enumerable, y seleccionar el tipo MARCAS del proyecto actual



- Los Descriptores de Tipo que corresponden a una colección, necesitan un Type Descriptor secundario del mismo tipo que representen a un ítem singular de la clase. De modo que seleccionamos listaMarcasTypeDescriptor en el Explorador de BDC y le agregamos un descriptor de tipo, y en sus propiedades le indicamos el Type Name correspondiente a la clase MARCAS publicada por LINQ to SQL, no enumerable, no colección



- Ahora es el momento de añadir una nueva instancia del método ReadList, configurando esa instancia como método Finder. Expande la sección de instancias del método ReadList en la ventana BDC Method Details, y agrega una instancia de tipo Finder

- Configura la instancia del método como es mostrado a continuación:



- Ahora configuraremos el método ReadItem, el proceso es similar al expuesto, sin embargo, para este método tendremos un parámetro llamado IdMarca, con dirección In, y un parámetro Marca, con dirección Return. La instancia del método para el método ReadItem tendrá un tipo de SpecificFinder

- Ahora es el momento de implementar el código del modelo. Si abres el código fuente del fichero MarcasService.cs, puedes ver que el diseñador ha generado el siguiente código de servicio

    public partial class EntityMarcasService
    {
        public static IEnumerable ReadList()
        {
            throw new System.NotImplementedException();
        }

        public static MARCAS ReadItem(string IdMarca)
        {
            throw new System.NotImplementedException();
        }
    }


- Reemplace la implementación de los métodos con código concreto, y estará listo para proveer a BCS de datos read-only. El siguiente listado muestra una implementación de código concreto:

        private static DataClasses1DataContext GetDataContext()
        {
            DataClasses1DataContext dataContext =
                new DataClasses1DataContext("Data Source=sharepointserver;Initial 
                    Catalog=SP_ORDENADORES;Integrated Security=True");

            return dataContext;
        }

        public static IEnumerable ReadList()
        {
            DataClasses1DataContext dataContext = GetDataContext();
            return (from m in dataContext.MARCAS select m);
        }

        public static MARCAS ReadItem(string idMarca)
        {
            DataClasses1DataContext dataContext = GetDataContext();
            return (dataContext.MARCAS.FirstOrDefault(m => m.IdMarca == 
                          Convert.ToInt32(idMarca)));
        }


- Ahora añadiremos los métodos Creator, Updater y Deleter

- El método Creator acepta un parámetro de tipo MARCAS con un valor de dirección In, y devuelve un resultado de tipo MARCAS de dirección Return

- El método Updater acepta al menos un parámetro de tipo MARCAS de dirección In, pero no devuelve nada, aunque es configurable para que tenga algún tipo de valor de retorno

- El método Deleter acepta un parámetro de tipo IdMarca con valor de dirección In, pero tampoco devuelve nada, aunque también es configurable para que tenga algún valor de retorno

- El siguiente listado muestra la implementación de los métodos de inserción, modificación y borrado en MarcasService.cs:

        public static MARCAS InsertItem(MARCAS marca)
        {
            DataClasses1DataContext dataContext = GetDataContext();

            dataContext.MARCAS.InsertOnSubmit(marca);
            dataContext.SubmitChanges();

            return marca;
        }

        public static void UpdateItem(MARCAS marca)
        {
            DataClasses1DataContext dataContext = GetDataContext();

            dataContext.MARCAS.Attach(marca, true);
            dataContext.SubmitChanges();
        }

        public static void DeleteItem(string IdMarca)
        {
            DataClasses1DataContext dataContext = GetDataContext();

            MARCAS marcaToDelete = dataContext.MARCAS.FirstOrDefault
                (m => m.IdMarca == Convert.ToInt32(IdMarca));

            dataContext.MARCAS.DeleteOnSubmit(marcaToDelete);
            dataContext.SubmitChanges();
        }


- Ahora repetimos el mismo proceso para la entidad EntityOrdenadores, de modo que nuestro diagrama .bdcm quede del siguiente modo:



- El siguiente paso en este proyecto es asociar las entidades, para navegar los datos a través de la asociación. De hecho, una asociación es un tipo particular de definición de instancia de método AssociatonNavigator. Así, tienes la capacidad de proveer parámetros de entrada y parámetros de filtro

- Para crear la asociación seleccionamos la entidad origen, en nuestro caso EntityMarcas, hacemos click derecho sobre ella, y en el menú contextual seleccionamos Agregar | Asociación



- Podemos elegir un nombre para el método de asociación en la columna método, cambiando el nombre suministrado por defecto EntityMarcasToEntityOrdenadores, por un nombre más descriptivo, por ejemplo VerOrdenadores, el cual aceptará un parámetro de tipo IdMarca para filtrar los ordenadores devueltos según la marca

- En nuestro ejemplo, la asociación será de tipo 1-n en sentido sólo de marcas hacia ordenadores (1 marca – n ordenadores), por lo que borraremos el método EntityOrdenadoresToEntityMarcas

- El punto clave de la asociación es la sección la casilla chequeable “Es una asociación de clave externa, que marcaremos a true, y consecuentemente la Asignación de identificadores, en la que indicaremos al Campo
ReadItem.IdOrdenador.IdOrdenadorTypeDescriptor que su Id de origen sea IdMarca (este campo obviamente está implementado en nuestra base de datos, en la tabla Ordenadores como foreign key referenciando a la tabla Marcas)

- El resultado de aplicar la configuración en el cuadro de diálogo es el siguiente:



- Comprobamos que ahora tenemos un método de asociación, llamado VerOrdenadores el cual debemos implementar para recuperar la lista de ordenadores de cada marca. El siguiente listado muestra la implementación:

        public static IEnumerable VerOrdenadores(string idMarca)
        {
            DataClasses1DataContext dataContext = GetDataContext();

            IEnumerable orderList = dataContext.ORDENADORES.Where
                (o => o.IdMarca == Convert.ToInt32(idMarca));

            return orderList;
        }


- Para desplegar nuestro proyecto podemos utilizar un Web Part que utilice las nuevas clases creadas




_

Documentación destacada sobre Business Connectivity Services:

http://msdn.microsoft.com/en-us/library/ee556826.aspx


Desde Innovar Tecnologías
, esperamos que este ejemplo les resulte de ayuda en su desarrollo

Web de la empresa

No hay comentarios:

Publicar un comentario