Compartir a través de


Código de aplicación de la herramienta Annotation Research (aplicación de ejemplo de EDM)

La Herramienta Annotation Research Entity Data Model (EDM) se implementa utilizando controles y un Formulario Windows del cuadro de herramientas Visual Studio.

Se utiliza un control WebBrowser para mostrar las referencias web. Varios cuadros de texto permiten que los usuarios escriban información que se vuelve anotaciones e información de contacto. Las cadenas URL asignadas a la propiedad Locator de instancias Reference se obtienen del objeto de documento de la página que se muestra en WebBrowser cuando se crean las instancias de la clase ReferenceDescriptor. Los controladores de eventos hacen todo el trabajo en respuesta a los datos proporcionados por el usuario. Para una pantalla que muestra la IU, consulte Herramienta Annotation and Research Collaboration (aplicación de ejemplo de EDM).

Archivo Exe.Config y cadena de conexión

El archivo exe.config siguiente contiene la cadena de conexión e información de configuración para una base de datos SQL Server o SQL Server Compact 3.5. También se hace referencia al espacio de nombres System.Data.EntityClient que contiene las clases utilizadas por la conexión y los metadatos.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="ResearchCollaborationData"
         connectionString="metadata=.;
             provider=System.Data.SqlClient;
             provider connection string='server=servername;
             database=ResearchCollaborationData;
             integrated security=true;
             multipleactiveresultsets=true'"
         providerName="System.Data.EntityClient"/>
  </connectionStrings>
</configuration>
Nota

Esta cadena de conexión establece Multiple Active Result Sets en true ya que se requiere para llamar al método Load en las asociaciones cuando otro lector de datos ya está abierto en la misma conexión.

Inicializar la conexión al almacenamiento

Con el archivo exe.config anterior en el ámbito del ejecutable y una referencia a System.Data.Entity.dll en el proyecto, una línea de código es suficiente para abrir una conexión a los datos utilizados por esta aplicación.

    ResearchCollaborationData researchCollaborationData =
                                    new ResearchCollaborationData();

Todos los controladores de eventos utilizados por aplicación para consultar o actualizar los datos utilizan esta inicialización. La conexión se cierra con la instrucción siguiente:

    researchCollaborationData.Connection.Close();

Crear un descriptor de la referencia

El siguiente código c rea una instancia de la clase ReferenceDescriptor y la guarda en el almacenamiento. La secuencia determina si la página en la ventana de WebBrowser ya existe como un objeto Reference. Si no existe, una nueva instancia de Reference se crea con ReferenceDescriptor. Si Reference aún no está en el almacenamiento, se agrega llamando a AddToReference: researchCollaborationData.AddToReferecne(newReference). El ReferenceDescriptor se agrega al almacenamiento llamando a researchCollaborationData.AddToReferenceDescriptor(newReferenceDescriptor).

El ReferenceDescriptor también se agrega a la colección representada por la propiedad de navegación de Reference llamada RefDescriptors: newReference.RefDescriptors.Add(newReferenceDescriptor). newReference.RefDescriptors.Add(newReferenceDescriptor).

La aplicación no implementa un método para crear una instancia Reference sin un ReferenceDescriptorasociado.

        private void buttonCreateRefDescriptor_Click(
            object sender, EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                using (researchCollaborationData =
                    new ResearchCollaborationData())
                {
                    ObjectParameter param = new ObjectParameter(
                        "p", webBrowser1.Document.Url.ToString());

                    if (!researchCollaborationData.Reference.Where(
                        "it.Locator = @p", param).Any())
                    {
                        Reference newReference = new Reference();
                        newReference.ReferenceID = Guid.NewGuid(); 
                        newReference.Locator = webBrowser1.Document.Url.ToString();

                        researchCollaborationData.AddToReference(newReference);

                        ReferenceDescriptor newReferenceDescriptor =
                             new ReferenceDescriptor();
                        newReferenceDescriptor.DescriptorID = Guid.NewGuid();

                        newReferenceDescriptor.Keyword = 
                            textBoxKeyWord.Text;

                        newReferenceDescriptor.Annotation = 
                            textBoxAnnotationResults.Text;

                        researchCollaborationData.AddToReferenceDescriptor(newReferenceDescriptor);

                        newReference.RefDescriptors.Add(
                            newReferenceDescriptor);
                    }
                    else
                    {
                        Reference reference = 
                            researchCollaborationData.Reference.Where(
                            "it.Locator = @p", param).First();

                        ReferenceDescriptor newReferenceDescriptor = 
                            new ReferenceDescriptor();
                        newReferenceDescriptor.DescriptorID = Guid.NewGuid();

                        newReferenceDescriptor.Keyword = 
                            textBoxKeyWord.Text;

                        newReferenceDescriptor.Annotation = 
                            textBoxAnnotationResults.Text;
                        researchCollaborationData.AddToReferenceDescriptor(newReferenceDescriptor);

                        reference.RefDescriptors.Add(
                            newReferenceDescriptor);
                    }

                    researchCollaborationData.SaveChanges();
                    

                    researchCollaborationData.Connection.Close();
                }
            }
            catch(Exception exception)
            {
                MessageBox.Show(exception.ToString());
                researchCollaborationData.Connection.Close();
            }
        }

Crear una instancia de ContactPerson

La creación de una nueva instancia ContactPerson y asociarla con una Reference, sigue el mismo procedimiento que crear ReferenceDescriptor y asociarlo a Reference. Hay cuatro las posibles opciones de código que dependen de si un o ambos ContactPerson y Reference ya existen. En el caso anterior en que se crea un ReferenceDescriptor, siempre se crea una nueva instancia del descriptor. El proceso de asociar ContactPerson con Reference determina si una instancia de ContactPerson ya representa este contacto.

Un ReferenceDescriptor está asociado únicamente con una Reference, mientras que ContactPerson puede asociarse con varias References. Para obtener más información sobre cómo implementar una Association varios a varios que admite esta relación, vea Esquemas de la herramienta Annotation Research (aplicación de ejemplo de EDM).

Las cuatro rutas de acceso del código en el controlador de eventos siguiente todos conectan instancias de la entidad ContactPerson con instancias de la entidad de la Referencia. La primera opción crea un nuevo ContactPerson y un nuevo Reference. Los nuevos ContactPerson y Reference se agregan al almacenamiento usando AddToContactPerson y AddToReference. Dado que ésta es una asociación múltiple, también se debe instanciar una nueva entidad de vínculo e inicializar sus propiedades de navegación para conectar instancias de ContactPerson y Reference.

                    ContactPersonReference newLink = 
                        new ContactPersonReference();
                    newLink.ContactPersonRefID = Guid.NewGuid();

                    newLink.RelatedContact = newContact;
                    newLink.RelatedReference = newReference;

Esta secuencia del código crea instancias de la entidad del vínculo denominada ContactPersonReference. La entidad del vínculo tiene propiedades de navegación que representan los dos extremos de la asociación: RelatedContact y RelatedReference. Éstos se asignan a las nuevas instancias de ContactPerson y Reference creadas en esta ruta de código. En otros casos, donde ContactPerson o Reference ya existen, las asignaciones utilizan instancias existentes localizadas por consultas de objeto.

La nueva entidad del vínculo se agrega al almacenamiento y todas las nuevas instancias de la entidad se guardan en el código siguiente.

        researchCollaborationData.AddToContactPersonReference(newLink);
        researchCollaborationData.SaveChanges();

En la secuencia siguiente se muestran dos de las cuatro posibles rutas del código. Para ver el controlador de eventos completo, consulte el método: private void buttonCreateRefPerson_Click(object sender, EventArgs e) en el código de controlador de eventos completo al final del tema.

                    ObjectParameter paramContact = 
                        new ObjectParameter("p", textBoxEmail.Text);

                    if (!researchCollaborationData.ContactPerson.Where(
                        "it.Email = @p", paramContact).Any())
                    {
                        ObjectParameter paramReference = 
                            new ObjectParameter("p", 
                            webBrowser1.Document.Url.ToString());

                        if (!researchCollaborationData.Reference.Where(
                            "it.Locator = @p", paramReference).Any())
                        {
                            // Neither contact nor reference exist.
                            ContactPerson newContact = new ContactPerson();
                            newContact.ContactPersonID = Guid.NewGuid(); 
                            newContact.LastName = textBoxLastName.Text;
                            newContact.FirstName = textBoxFirstName.Text; 
                            newContact.Email = textBoxEmail.Text;

                            newContact.Title = 
                                textBoxTitlePosition.Text;

                            researchCollaborationData.AddToContactPerson(newContact);

                            Reference newReference = new Reference();
                            newReference.ReferenceID = Guid.NewGuid(); 
                            newReference.Locator = webBrowser1.Document.Url.ToString();

                            researchCollaborationData.AddToReference(newReference);

                            ContactPersonReference newLink = 
                                new ContactPersonReference();
                            newLink.ContactPersonRefID = Guid.NewGuid();

                            newLink.RelatedContact = newContact;
                            newLink.RelatedReference = newReference;
                            researchCollaborationData.AddToContactPersonReference(newLink);
                        }

                        else
                        {
                            // Reference exists but contact doesn't.
                            Reference reference = 
                                researchCollaborationData.Reference.
                                Where("it.Locator = @p", 
                                paramReference).First();

                            ContactPerson newContact = new ContactPerson();
                            newContact.ContactPersonID = Guid.NewGuid(); 
                            newContact.LastName = textBoxLastName.Text;
                            newContact.FirstName = textBoxFirstName.Text; 
                            newContact.Email = textBoxEmail.Text;

                            newContact.Title = 
                                textBoxTitlePosition.Text;

                            researchCollaborationData.AddToContactPerson(newContact);

                            ContactPersonReference newLink = new ContactPersonReference();
                            newLink.ContactPersonRefID = Guid.NewGuid();
                            newLink.RelatedContact = newContact;
                            newLink.RelatedReference = reference;
                            researchCollaborationData.AddToContactPersonReference(newLink);

                        }
                    }

Utilizar los descriptores de la referencia para buscar referencias

Las instancias de la entidad ReferenceDescriptor son anotaciones que se utilizan para describir y buscar los recursos web de forma que la búsqueda no tenga que repetirse o catalogarse en otro lugar. Cada ReferenceDescriptor representa una anotación única. Varias instancias de ReferenceDescriptor pueden describir una página web, pero cada instancia sólo puede estar asociada a una página.

Las referencias web se anotan agregando las instancias ReferenceDescriptor como se describe en los segmentos de código anteriores. Al buscar en las propiedades Keyword y Annotation de las instancias ReferenceDescriptor, se proporciona un medio para reubicar las páginas Reference útiles. Se activa el controlador de eventos siguiente cuando el usuario escribe palabras clave o una frase de búsqueda en el cuadro de texto de búsqueda y hace clic el botón Find.

        private void buttonSearch_Click(object sender, EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                using (researchCollaborationData = 
                    new ResearchCollaborationData())
                {
                    // Make a list of keywords to search for in annotatations.
                    List<string> keywords = new List<string>();
                    int i = 0;
                    int j = 0;
                    while (i < textBoxSearch.Text.Length)
                    {
                        j = textBoxSearch.Text.IndexOf(" ", i);
                        if (-1 == j) j = textBoxSearch.Text.Length;

                        keywords.Add(
                             textBoxSearch.Text.Substring(i, j - i));

                        i = ++j;
                    }

                    textBoxAnnotationResults.Text = "Results:";
                    foreach (string keyword in keywords)
                    {
                        // Create ObjectParameter from each keyword.
                        ObjectParameter paramKeyword = 
                            new ObjectParameter(
                            "p", "%" + keyword + "%");

                        ObjectQuery<ReferenceDescriptor> 
                            descriptorQuery = 
                            researchCollaborationData.
                            ReferenceDescriptor.Where(
                            "it.Annotation LIKE @p OR it.Keyword LIKE @p",
                            paramKeyword);

                        foreach (ReferenceDescriptor refDescriptor
                                                  in descriptorQuery)
                        {

                            textBoxAnnotationResults.Text = 
                                textBoxAnnotationResults.Text + "\n" +
                                refDescriptor.Keyword + "\n" + 
                                refDescriptor.Annotation;

                           refDescriptor.ReferenceReference.Load();

                            Reference reference = refDescriptor.Reference;

                            textBoxAnnotationResults.Text = 
                                textBoxAnnotationResults.Text + "\n" +
                                reference.Locator + "\n";

                            foreach (ContactPersonReference contactPersRef in
                                researchCollaborationData.ContactPersonReference)
                            {
                                contactPersRef.RelatedReferenceReference.Load();
                                if (contactPersRef.RelatedReferenceReference.Value.Equals(
                                    reference))
                                {
                                    contactPersRef.RelatedContactReference.Load();

                                    textBoxAnnotationResults.Text =
                                    textBoxAnnotationResults.Text +
                                    "\n" +
                                    "Relevant Contact:";

                                    textBoxAnnotationResults.Text =
                                        textBoxAnnotationResults.Text +
                                        "\n" +
                                        contactPersRef.
                                        RelatedContact.FirstName + " " +
                                        contactPersRef.RelatedContact.
                                        LastName +
                                        " Title: " + contactPersRef.
                                        RelatedContact.Title + " Email: "
                                        + contactPersRef.RelatedContact.
                                        Email
                                        + "\n";
                                }
                            }                            
                        }                        
                    }
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }
            
        }

Este código está compuesto de dos secuencias básicas: una para crear List<T> de cadenas de búsqueda y otra para buscar texto coincidente en las propiedades Annotation y Keyword de las instancias ReferenceDescriptor.

La creación de la lista de cadenas de búsqueda se logra analizando el texto de entrada. La consulta es un ObjectQuery parametrizado que se utiliza en un bucle que inserta cada cadena de búsqueda en la consulta y la compara con los textos asignados a las propiedades Annotation y Keyword de instancias de ReferenceDescriptor en almacenamiento. Se instancian las clases ObjectQuery y ObjectParameter en el segmento de código siguiente.

               // Create ObjectParameter from each keyword.
               ObjectParameter paramKeyword = 
                    new ObjectParameter(
                    "p", "%" + keyword + "%");

                ObjectQuery<ReferenceDescriptor> 
                     descriptorQuery = 
                     researchCollaborationData.
                     ReferenceDescriptor.Where(
                     "it.Annotation LIKE @p OR it.Keyword LIKE @p",
                     paramKeyword);

Cada ReferenceDescriptor devuelto por ObjectQuery escribe un bucle que carga la Reference relacionada mediante la NavigationProperty y Association diseñado para este propósito. El segmento de código siguiente carga Reference, lee su propiedad Locator y muestra la dirección URL a Reference como un vínculo en el cuadro de texto de resultados.

                           refDescriptor.ReferenceReference.Load();

                            Reference reference = refDescriptor.Reference;

                            textBoxAnnotationResults.Text = 
                                textBoxAnnotationResults.Text + "\n" +
                                reference.Locator + "\n";

Finalmente, el método busca y muestra información sobre los contactos relacionados con Reference. Un método estático del LinkTable_ReferenceAssociation se utiliza para buscar las entidades de tabla de vínculo asociadas a Reference. Las instancias de ContactPersonReference, las entidades de tabla de vínculo que contienen Reference, escriben un bucle que carga y muestra las propiedades de ContactPerson relacionado. Las propiedades FirstName, LastName, Email y Title se muestran emparejadas con el texto Reference, Annotation y Locator encontrados por código anterior.

                            foreach (ContactPersonReference contactPersRef in
                                researchCollaborationData.ContactPersonReference)
                            {
                                contactPersRef.RelatedReferenceReference.Load();
                                if (contactPersRef.RelatedReferenceReference.Equals(
                                    reference))
                                {
                                    contactPersRef.RelatedContactReference.Load();

                                    textBoxAnnotationResults.Text =
                                    textBoxAnnotationResults.Text +
                                    "\n" +
                                    "Relevant Contact:";

                                    textBoxAnnotationResults.Text =
                                        textBoxAnnotationResults.Text +
                                        "\n" +
                                        contactPersRef.
                                        RelatedContact.FirstName + " " +
                                        contactPersRef.RelatedContact.
                                        LastName +
                                        " Title: " + contactPersRef.
                                        RelatedContact.Title + " Email: "
                                        + contactPersRef.RelatedContact.
                                        Email
                                        + "\n";
                                }
                            }  

Buscar referencias asociadas a contactos

Las instancias de Reference relacionadas con las instancias ContactPerson se pueden buscar utilizando la misma entidad de tabla de vínculo y asociaciones que el segmento de código anterior. Los usuarios de esta aplicación pueden buscar las páginas de referencia de un contacto escribiendo el texto en los cuadros de texto LastName y/o Email y haciendo clic en el botón Find Ref/Person. Las instancias nuevas de ObjectParameter se crean a partir de los textos Email y LastName. ObjectQuery utiliza los parámetros para buscar una persona con el apellido o dirección de correo electrónico coincidentes. El método Any de ObjectQuery se utiliza para comprobar si hay resultados para esta consulta.

Si se encuentra una instancia de ContactPerson con el apellido o la dirección de correo electrónico coincidente, la información de contacto se muestra con documentos Reference asociados. Se buscan los documentos relacionados, como en el método anterior, utilizando la entidad de vínculo ContactPersonReference y sus propiedades de navegación.

        private void buttonFindRefPerson_Click(object sender, EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                using (researchCollaborationData = 
                    new ResearchCollaborationData())
                {
                    // Use parameters from LastName and 
                    // Email text boxes in search.
                    ObjectParameter emailParam = new ObjectParameter(
                        "email", textBoxEmail.Text);
                    ObjectParameter nameParam = new ObjectParameter(
                        "name", textBoxLastName.Text);
                    ObjectParameter[] objParams = { emailParam, 
                        nameParam };
                    
                    ObjectQuery<ContactPerson> query = 
                        researchCollaborationData.ContactPerson.Where(
                        "it.Email = @email OR it.LastName = @name", 
                        objParams );

                    if (query.Any())
                    {
                        textBoxAnnotationResults.Text = 
                            "Contact and associated reference documents:\n";

                        ContactPerson person = null;
                        query.FirstOrDefault(out person);

                        // Display contact information and 
                        // related references.
                        textBoxAnnotationResults.Text = 
                            textBoxAnnotationResults.Text +
                            person.FirstName + " " + person.LastName +
                            " Title: " + person.Title +
                            " Email address: " + person.Email;

                        ObjectParameter contactParam = 
                            new ObjectParameter("p", 
                            person.ContactPersonID);

                        foreach (ContactPersonReference contactReference
                            in researchCollaborationData.
                            ContactPersonReference.Where(
                            "it.RelatedContact.ContactPersonID = @p",
                            contactParam))
                        {
                            contactReference.RelatedReferenceReference.
                                Load();

                            textBoxAnnotationResults.Text = 
                                textBoxAnnotationResults.Text + "\n" +
                                contactReference.RelatedReference.Locator;
                        }
                    }                                        
                }
            }

            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }

        }

Código de controlador de sucesos de la aplicación completo

El código siguiente contiene todos los controladores de eventos utilizados para inicializar EntityConnection y buscar y actualizar los datos generados en el modelo de datos de investigación y colaboración.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;
using System.Data.Objects;
using System.Linq;
using ResearchCollaborationDataModel;

namespace ResearchCollaboration
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();

            try
            {
                webBrowser1.Navigate(
                    "http://www.live.com/?searchonly=true");               

            }

            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

        private void buttonNavigate_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate(textBoxUri.Text);
        }

        private void buttonCreateRefDescriptor_Click(
            object sender, EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                using (researchCollaborationData =
                    new ResearchCollaborationData())
                {
                    ObjectParameter param = new ObjectParameter(
                        "p", webBrowser1.Document.Url.ToString());

                    if (!researchCollaborationData.Reference.Where(
                        "it.Locator = @p", param).Any())
                    {
                        Reference newReference = new Reference();
                        newReference.ReferenceID = Guid.NewGuid(); 
                        newReference.Locator = webBrowser1.Document.Url.ToString();

                        researchCollaborationData.AddToReference(newReference);

                        ReferenceDescriptor newReferenceDescriptor =
                             new ReferenceDescriptor();
                        newReferenceDescriptor.DescriptorID = Guid.NewGuid();

                        newReferenceDescriptor.Keyword = 
                            textBoxKeyWord.Text;

                        newReferenceDescriptor.Annotation = 
                            textBoxAnnotationResults.Text;

                        researchCollaborationData.AddToReferenceDescriptor(newReferenceDescriptor);

                        newReference.RefDescriptors.Add(
                            newReferenceDescriptor);
                    }
                    else
                    {
                        Reference reference = 
                            researchCollaborationData.Reference.Where(
                            "it.Locator = @p", param).First();

                        ReferenceDescriptor newReferenceDescriptor = 
                            new ReferenceDescriptor();
                        newReferenceDescriptor.DescriptorID = Guid.NewGuid();

                        newReferenceDescriptor.Keyword = 
                            textBoxKeyWord.Text;

                        newReferenceDescriptor.Annotation = 
                            textBoxAnnotationResults.Text;
                        researchCollaborationData.AddToReferenceDescriptor(newReferenceDescriptor);

                        reference.RefDescriptors.Add(
                            newReferenceDescriptor);
                    }

                    researchCollaborationData.SaveChanges();
                    

                    researchCollaborationData.Connection.Close();
                }
            }
            catch(Exception exception)
            {
                MessageBox.Show(exception.ToString());
                researchCollaborationData.Connection.Close();
            }
        }

 
        private void buttonSearch_Click(object sender, EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                using (researchCollaborationData = 
                    new ResearchCollaborationData())
                {
                    // Make a list of keywords to search for in annotatations.
                    List<string> keywords = new List<string>();
                    int i = 0;
                    int j = 0;
                    while (i < textBoxSearch.Text.Length)
                    {
                        j = textBoxSearch.Text.IndexOf(" ", i);
                        if (-1 == j) j = textBoxSearch.Text.Length;

                        keywords.Add(
                             textBoxSearch.Text.Substring(i, j - i));

                        i = ++j;
                    }

                    textBoxAnnotationResults.Text = "Results:";
                    foreach (string keyword in keywords)
                    {
                        // Create ObjectParameter from each keyword.
                        ObjectParameter paramKeyword = 
                            new ObjectParameter(
                            "p", "%" + keyword + "%");

                        ObjectQuery<ReferenceDescriptor> 
                            descriptorQuery = 
                            researchCollaborationData.
                            ReferenceDescriptor.Where(
                            "it.Annotation LIKE @p OR it.Keyword LIKE @p",
                            paramKeyword);

                        foreach (ReferenceDescriptor refDescriptor
                                                  in descriptorQuery)
                        {

                            textBoxAnnotationResults.Text = 
                                textBoxAnnotationResults.Text + "\n" +
                                refDescriptor.Keyword + "\n" + 
                                refDescriptor.Annotation;

                           refDescriptor.ReferenceReference.Load();

                            Reference reference = refDescriptor.Reference;

                            textBoxAnnotationResults.Text = 
                                textBoxAnnotationResults.Text + "\n" +
                                reference.Locator + "\n";

                            foreach (ContactPersonReference contactPersRef in
                                researchCollaborationData.ContactPersonReference)
                            {
                                contactPersRef.RelatedReferenceReference.Load();
                                if (contactPersRef.RelatedReferenceReference.Equals(
                                    reference))
                                {
                                    contactPersRef.RelatedContactReference.Load();

                                    textBoxAnnotationResults.Text =
                                    textBoxAnnotationResults.Text +
                                    "\n" +
                                    "Relevant Contact:";

                                    textBoxAnnotationResults.Text =
                                        textBoxAnnotationResults.Text +
                                        "\n" +
                                        contactPersRef.
                                        RelatedContact.FirstName + " " +
                                        contactPersRef.RelatedContact.
                                        LastName +
                                        " Title: " + contactPersRef.
                                        RelatedContact.Title + " Email: "
                                        + contactPersRef.RelatedContact.
                                        Email
                                        + "\n";
                                }
                            }                            
                        }                        
                    }
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }
            
        }

        
        private void buttonCreateRefPerson_Click(object sender, 
            EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                using (researchCollaborationData = 
                    new ResearchCollaborationData())
                {
                    // There are four possible cases depending 
                    // whether contact and reference exist.

                    ObjectParameter paramContact = 
                        new ObjectParameter("p", textBoxEmail.Text);

                    if (!researchCollaborationData.ContactPerson.Where(
                        "it.Email = @p", paramContact).Any())
                    {
                        ObjectParameter paramReference = 
                            new ObjectParameter("p", 
                            webBrowser1.Document.Url.ToString());

                        if (!researchCollaborationData.Reference.Where(
                            "it.Locator = @p", paramReference).Any())
                        {
                            // Neither contact nor reference exist.
                            ContactPerson newContact = new ContactPerson();
                            newContact.ContactPersonID = Guid.NewGuid(); 
                            newContact.LastName = textBoxLastName.Text;
                            newContact.FirstName = textBoxFirstName.Text; 
                            newContact.Email = textBoxEmail.Text;

                            newContact.Title = 
                                textBoxTitlePosition.Text;

                            researchCollaborationData.AddToContactPerson(newContact);

                            Reference newReference = new Reference();
                            newReference.ReferenceID = Guid.NewGuid(); 
                            newReference.Locator = webBrowser1.Document.Url.ToString();

                            researchCollaborationData.AddToReference(newReference);

                            ContactPersonReference newLink = 
                                new ContactPersonReference();
                            newLink.ContactPersonRefID = Guid.NewGuid();

                            newLink.RelatedContact = newContact;
                            newLink.RelatedReference = newReference;
                            researchCollaborationData.AddToContactPersonReference(newLink);
                        }

                        else
                        {
                            // Reference exists but contact doesn't.
                            Reference reference = 
                                researchCollaborationData.Reference.
                                Where("it.Locator = @p", 
                                paramReference).First();

                            ContactPerson newContact = new ContactPerson();
                            newContact.ContactPersonID = Guid.NewGuid(); 
                            newContact.LastName = textBoxLastName.Text;
                            newContact.FirstName = textBoxFirstName.Text; 
                            newContact.Email = textBoxEmail.Text;

                            newContact.Title = 
                                textBoxTitlePosition.Text;

                            researchCollaborationData.AddToContactPerson(newContact);

                            ContactPersonReference newLink = new ContactPersonReference();
                            newLink.ContactPersonRefID = Guid.NewGuid();
                            newLink.RelatedContact = newContact;
                            newLink.RelatedReference = reference;
                            researchCollaborationData.AddToContactPersonReference(newLink);

                        }
                    }

                    else
                    {
                        // Contact exists but reference doesn't.
                        ObjectParameter paramReference = 
                            new ObjectParameter("p", 
                            webBrowser1.Document.Url.ToString());

                        if (!researchCollaborationData.Reference.Where(
                            "it.Locator = @p", paramReference).Any())
                        {
                            ContactPerson contact = 
                                researchCollaborationData.ContactPerson.
                                Where("it.Email = @p", 
                                paramContact).First();

                            Reference newReference = new Reference();
                            newReference.ReferenceID = Guid.NewGuid(); 
                            newReference.Locator = webBrowser1.Document.Url.ToString();

                            researchCollaborationData.AddToReference(newReference);

                            ContactPersonReference newLink = new ContactPersonReference();
                            newLink.ContactPersonRefID = Guid.NewGuid();

                            newLink.RelatedContact = contact;
                            newLink.RelatedReference = newReference;
                            researchCollaborationData.AddToContactPersonReference(newLink);

                        }

                        else
                        {
                            // Contact and reference both exist.
                            Reference reference = 
                                researchCollaborationData.Reference.
                                Where("it.Locator = @p", 
                                paramReference).First();

                            ContactPerson contact = 
                                researchCollaborationData.
                                ContactPerson.Where("it.Email = @p", 
                                paramContact).First();
                            
                            ContactPersonReference newLink = new ContactPersonReference();
                            newLink.ContactPersonRefID = Guid.NewGuid();
                            newLink.RelatedContact = contact;
                            newLink.RelatedReference = reference;
                            researchCollaborationData.AddToContactPersonReference(newLink);

                        }
                        
                    }

                    researchCollaborationData.SaveChanges();

                    researchCollaborationData.Connection.Close();
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }

        }
        
        private void buttonFindRefPerson_Click(object sender, EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                using (researchCollaborationData = 
                    new ResearchCollaborationData())
                {
                    // Use parameters from LastName and 
                    // Email text boxes in search.
                    ObjectParameter emailParam = new ObjectParameter(
                        "email", textBoxEmail.Text);
                    ObjectParameter nameParam = new ObjectParameter(
                        "name", textBoxLastName.Text);
                    ObjectParameter[] objParams = { emailParam, 
                        nameParam };
                    
                    ObjectQuery<ContactPerson> query = 
                        researchCollaborationData.ContactPerson.Where(
                        "it.Email = @email OR it.LastName = @name", 
                        objParams );

                    if (query.Any())
                    {
                        textBoxAnnotationResults.Text = 
                            "Contact and associated reference documents:\n";

                        ContactPerson person = null;
                        query.FirstOrDefault(out person);

                        // Display contact information and 
                        // related references.
                        textBoxAnnotationResults.Text = 
                            textBoxAnnotationResults.Text +
                            person.FirstName + " " + person.LastName +
                            " Title: " + person.Title +
                            " Email address: " + person.Email;

                        ObjectParameter contactParam = 
                            new ObjectParameter("p", 
                            person.ContactPersonID);

                        foreach (ContactPersonReference contactReference
                            in researchCollaborationData.
                            ContactPersonReference.Where(
                            "it.RelatedContact.ContactPersonID = @p",
                            contactParam))
                        {
                            contactReference.RelatedReferenceReference.
                                Load();

                            textBoxAnnotationResults.Text = 
                                textBoxAnnotationResults.Text + "\n" +
                                contactReference.RelatedReference.Locator;
                        }
                    }                                        
                }
            }

            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }

        }

        private void textBoxUri_PreviewKeyDown(object sender, 
            PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode.Equals(Keys.Return))
                buttonNavigate_Click(this, System.EventArgs.Empty);
        }

        private void textBoxSearch_PreviewKeyDown(object sender, 
            PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode.Equals(Keys.Return))
                buttonSearch_Click(this, null);
        }

        private void textBoxAnnotationResults_LinkClicked(object sender, 
            LinkClickedEventArgs e)
        {
            // Display the Locator URL in Web browser.
            webBrowser1.Navigate(e.LinkText);
        }

        private void webBrowser1_DocumentCompleted(object sender, 
            WebBrowserDocumentCompletedEventArgs e)
        {
            textBoxUri.Text = webBrowser1.Document.Url.ToString();
        }

        private void textBoxEmail_MouseDoubleClick(object sender, 
            MouseEventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                researchCollaborationData = 
                    new ResearchCollaborationData();

                textBoxAnnotationResults.Text = 
                    "Contacts and related references:";

                // Find and display all contacts and 
                // their related references.
                foreach (ContactPerson person in 
                    researchCollaborationData.ContactPerson)
                {
                    textBoxAnnotationResults.Text = 
                        textBoxAnnotationResults.Text + "\n\n" +
                        person.FirstName + " " + person.LastName + 
                        " Title: " + person.Title +
                        " Email address: " + person.Email;

                    ObjectParameter contactParam = new ObjectParameter(
                        "p", person.ContactPersonID);

                    foreach (ContactPersonReference contactReference in 
                        researchCollaborationData.ContactPersonReference.
                        Where("it.RelatedContact.ContactPersonID = @p",
                        contactParam))
                    {
                        contactReference.RelatedReferenceReference.Load();
                        textBoxAnnotationResults.Text = 
                            textBoxAnnotationResults.Text + 
                            "\n" + 
                            contactReference.RelatedReference.Locator;
                    }

                }     

            }

            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }

        }

        private void textBoxSearch_MouseDoubleClick(object sender,
            EventArgs e)
        {
            ResearchCollaborationData researchCollaborationData = null;
            try
            {
                researchCollaborationData = 
                    new ResearchCollaborationData();

                textBoxAnnotationResults.Text = 
                    "All references and related contacts:\n";

                foreach (ReferenceDescriptor refDescriptor in 
                    researchCollaborationData.ReferenceDescriptor)
                {

                    textBoxAnnotationResults.Text = 
                        textBoxAnnotationResults.Text + "\n" +
                        refDescriptor.Keyword + "\n" + 
                        refDescriptor.Annotation;
                    
                    refDescriptor.ReferenceReference.Load();

                    Reference reference = refDescriptor.Reference;

                    textBoxAnnotationResults.Text = 
                        textBoxAnnotationResults.Text + "\n" +
                        reference.Locator + "\n";

                    foreach (ContactPersonReference contactPersonRef in 
                        researchCollaborationData.ContactPersonReference)
                    {
                        if(contactPersonRef.Equals(reference))
                        {
                            contactPersonRef.RelatedContactReference.Load();

                            textBoxAnnotationResults.Text = 
                            textBoxAnnotationResults.Text + "\n" +
                            "Relevant Contact:";

                            textBoxAnnotationResults.Text = 
                            textBoxAnnotationResults.Text + "\n" +
                            contactPersonRef.RelatedContact.FirstName + " " + 
                            contactPersonRef.RelatedContact.LastName + " Title: " + 
                            contactPersonRef.RelatedContact.Title + " Email: " +
                            contactPersonRef.RelatedContact.Email + "\n";
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }

        }
        
    }
}

Vea también

Conceptos

Herramienta Annotation and Research Collaboration (aplicación de ejemplo de EDM)
Esquemas de la herramienta Annotation Research (aplicación de ejemplo de EDM)