Code Snippet: Create an External Content Type Using the Administration Object Model

Applies to: SharePoint Server 2010

In this article
Description
Prerequisites
To use this example

Description

The following code example shows how to programmatically create an external content type using the BDC Administration object model on the server.

Note

You can use the BDC Administration Client Object Model to create an external content type similarly on the client.

Prerequisites

  • Microsoft SharePoint Server 2010 or Microsoft SharePoint Foundation 2010 on the server.

  • Microsoft .NET Framework 3.5 on the client computer.

  • Microsoft Visual Studio.

To use this example

  1. Start Visual Studio and create a C# Console application project. Select .NET Framework 3.5 when you create the project.

  2. From the View menu, click Property Pages to bring up the project properties.

  3. In the Build tab, for the Platform target, select Any CPU.

  4. Close the project properties window.

  5. In Solution Explorer, under References, remove all project references except for System and System.Core.

  6. Add the following references to the project:

    1. Microsoft.BusinessData

    2. Microsoft.SharePoint

    3. System.Web

  7. Replace the autogenerated code in Program.cs with the code listed at the end of this procedure.

  8. Replace the <siteUrl> string value with a valid SharePoint site name. Also, set the LobSystemInstance parameters as per your external system.

  9. Save the project.

  10. Compile and run the project.

using System;
using System.Linq;
using Microsoft.BusinessData.MetadataModel;
using Microsoft.BusinessData.Runtime;
using Microsoft.SharePoint.BusinessData.SharedService;
using Microsoft.SharePoint.BusinessData.Administration;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;


namespace Microsoft.SDK.SharePoint.Samples.Bdc.CreateEntity
{
    class Program
    {
        static void Main(string[] args)
        {
            // Get the Catalog for the SharePoint site
            BdcService service =
                SPFarm.Local.Services.GetValue<BdcService>(String.Empty);
            SPSite site = new SPSite("<siteUrl>");
            SPServiceContext context = SPServiceContext.GetContext(site);
            AdministrationMetadataCatalog catalog = 
                service.GetAdministrationMetadataCatalog(context);


            // Create a new Contact Model
            // NOTE: Assume that the "ContactModel" Model 
            // does not already exist.
            Model contactModel = Model.Create(
                "ContactModel", true, catalog);


            // Make a new Contact LobSystem
            // NOTE: Assume that the "AdventureWorks" LobSystem 
            // does not already exist.
            LobSystem adventureWorksLobSystem = 
                contactModel.OwnedReferencedLobSystems.Create(
                "AdventureWorks", true, SystemType.Database);

            // Make a new AdventureWorks LobSystemInstance.
            LobSystemInstance adventureWorksLobSystemInstance = 
                adventureWorksLobSystem.LobSystemInstances.Create(
                "AdventureWorks", true);

            // Set the connection properties.
            adventureWorksLobSystemInstance.Properties.Add(
                "AuthenticationMode", "PassThrough");
            adventureWorksLobSystemInstance.Properties.Add(
                "DatabaseAccessProvider", "SqlServer");
            adventureWorksLobSystemInstance.Properties.Add(
                "RdbConnection Data Source", "MSS2010");
            adventureWorksLobSystemInstance.Properties.Add(
                "RdbConnection Initial Catalog", "AdventureWorks");
            adventureWorksLobSystemInstance.Properties.Add(
                "RdbConnection Integrated Security", "SSPI");
            adventureWorksLobSystemInstance.Properties.Add(
                "RdbConnection Pooling", "true");

            // Create a new Contact Entity.
            Entity contactEntity = Entity.Create(
                "Contact", 
                "AdventureWorks", 
                true, 
                new Version("1.0.0.0"), 
                10000, 
                CacheUsage.Default, 
                adventureWorksLobSystem, 
                contactModel, 
                catalog);

            // Set the identifier to the ContactID column.
            contactEntity.Identifiers.Create(
                "ContactID", true, "System.Int32");

            // Create the Finder Method, 
            // i.e. the method to return all rows.
            CreateReadListMethod(catalog, contactEntity);

            // Create the Specific Finder Method, 
            // i.e. the method to return one row.
            CreateReadItemMethod(catalog, contactEntity);

            // Validate the Contact Entity.
            ActivationError[] activationErrors = 
                contactEntity.Validate();

            // Check if the validation failed.
            if (activationErrors.Count() == 0)
            {
                // The validation was successful so publish the Contact Entity.
                contactEntity.Activate();

                Console.WriteLine("Created Contact Model");
            }
            else
            {
                // The validation failed so display the validation errors.
                Console.WriteLine("Contact Model was not created and" + 
                    " failed with the following errors:");
                foreach (ActivationError item in activationErrors)
                {
                    Console.WriteLine(item.ToString());
                }

            }

            // Wait for any key to be hit before exiting the program
            Console.ReadKey();
        }
    
        private static void CreateReadListMethod(
            AdministrationMetadataCatalog catalog, Entity contactEntity)
        {
            // Create the Finder method
            Method getContactsMethod = contactEntity.Methods.Create(
                "GetContacts", true, false, "Contact");

            // Specify the query
            getContactsMethod.Properties.Add(
                "RdbCommandText", 
                "SELECT TOP(@MaxRowsReturned) [ContactID], [LastName]," + 
                " [Phone], [EmailAddress] FROM [Person].[Contact]");

            // Set the command type
            getContactsMethod.Properties.Add("RdbCommandType", "Text");

            // Set the additional property values so that this 
            // External Content Type can be displayed 
            // in SharePoint Designer.
            getContactsMethod.Properties.Add(
                "Schema", "Person");
            getContactsMethod.Properties.Add(
                "BackEndObjectType", "SqlServerTable");
            getContactsMethod.Properties.Add(
                "BackEndObject", "Contact");

            // Create a Filter so that we can limit the number 
            // of rows returned;
            // otherwise we may exceed the list query size threshold.
            FilterDescriptor limitRowsReturnedFilter = 
                getContactsMethod.FilterDescriptors.Create(
                "RowsReturnedLimit", true, FilterType.Limit, null);
            limitRowsReturnedFilter.Properties.Add(
                "IsDefault", true);

            // Create the RowsToRetrieve input parameter.
            Parameter maxRowsReturnedParameter = 
                getContactsMethod.Parameters.Create(
                "@MaxRowsReturned", true, DirectionType.In);

            // Create the TypeDescriptor for the MaxRowsReturned parameter.
            // using the Filter we have created.
            TypeDescriptor maxRowsReturnedTypeDescriptor = 
                maxRowsReturnedParameter.CreateRootTypeDescriptor(
                "MaxRowsReturned", 
                true, 
                "System.Int64", 
                "MaxRowsReturned", 
                null, 
                limitRowsReturnedFilter, 
                TypeDescriptorFlags.None, 
                null, 
                catalog);

            // Create the Contacts return parameter.
            Parameter contactsParameter = 
                getContactsMethod.Parameters.Create(
                "GetContacts", true, DirectionType.Return);

            // Create the TypeDescriptors for the Contacts return parameter.
            TypeDescriptor returnRootCollectionTypeDescriptor = 
                contactsParameter.CreateRootTypeDescriptor(
                "Contacts", 
                true, 
                "System.Data.IDataReader, System.Data, Version=2.0.0.0," + 
                " Culture=neutral, PublicKeyToken=b77a5c561934e089", 
                "Contacts", 
                null, 
                null, 
                TypeDescriptorFlags.IsCollection, 
                null, 
                catalog);
            TypeDescriptor returnRootElementTypeDescriptor = 
                returnRootCollectionTypeDescriptor.ChildTypeDescriptors.Create(
                "Contact", 
                true, 
                "System.Data.IDataRecord, System.Data, Version=2.0.0.0," + 
                " Culture=neutral, PublicKeyToken=b77a5c561934e089", 
                "Contact", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "ContactID", 
                true, 
                "System.Int32", 
                "ContactID", 
                new IdentifierReference("ContactID", 
                    new EntityReference("AdventureWorks", "Contact", catalog), 
                    catalog), 
                null, 
                TypeDescriptorFlags.None, 
                null);
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "LastName", 
                true, 
                "System.String", 
                "LastName", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "Phone", 
                true, 
                "System.String", 
                "Phone", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "EmailAddress", 
                true, 
                "System.String", 
                "EmailAddress", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);

            // Create the finder method instance
            MethodInstance readListMethodInstance = 
                getContactsMethod.MethodInstances.Create(
                "GetContacts", 
                true, 
                returnRootCollectionTypeDescriptor, 
                MethodInstanceType.Finder, 
                true);

            // Set the default value for the number of rows 
            // to be returned filter.
            // NOTE: The method instance needs to be created first 
            // before we can set the default value.
            maxRowsReturnedTypeDescriptor.SetDefaultValue(
                readListMethodInstance.Id, Int64.Parse("200"));
        }

        private static void CreateReadItemMethod(
            AdministrationMetadataCatalog catalog, Entity contactEntity)
        {
            // Create the specific finder method
            Method getContactMethod = contactEntity.Methods.Create(
                "GetContact", true, false, "Contact");

            // Specify the query
            getContactMethod.Properties.Add(
                "RdbCommandText", 
                "SELECT [ContactID], [LastName], [EmailAddress]," + 
                " [Phone] FROM [Person].[Contact]" + 
                " WHERE [ContactID] = @ContactID");

            // Set the command type
            getContactMethod.Properties.Add("RdbCommandType", "Text");


            getContactMethod.Properties.Add(
                "Schema", "Person");
            getContactMethod.Properties.Add(
                "BackEndObjectType", "SqlServerTable");
            getContactMethod.Properties.Add(
                "BackEndObject", "Contact");

            // Create the ContactID input parameter
            Parameter contactIdParameter = 
                getContactMethod.Parameters.Create(
                "@ContactID", true, DirectionType.In);

            // Create the TypeDescriptor for the ContactID parameter
            contactIdParameter.CreateRootTypeDescriptor(
                "ContactID", 
                true, 
                "System.Int32", 
                "ContactID", 
                new IdentifierReference(
                    "ContactID", 
                    new EntityReference("AdventureWorks", "Contact", catalog), 
                    catalog), 
                null, 
                TypeDescriptorFlags.None, 
                null, 
                catalog);

            // Create the Contact return parameter
            Parameter contactParameter = 
                getContactMethod.Parameters.Create(
                "Contact", true, DirectionType.Return);

            // Create the TypeDescriptors for the Contact return parameter.
            TypeDescriptor returnRootCollectionTypeDescriptor = 
                contactParameter.CreateRootTypeDescriptor(
                "Contacts", 
                true, 
                "System.Data.IDataReader, System.Data, Version=2.0.0.0," + 
                " Culture=neutral, PublicKeyToken=b77a5c561934e089", 
                "Contacts", 
                null, 
                null, 
                TypeDescriptorFlags.IsCollection, 
                null, 
                catalog);            
            TypeDescriptor returnRootElementTypeDescriptor = 
                returnRootCollectionTypeDescriptor.ChildTypeDescriptors.Create(
                "Contact", 
                true, 
                "System.Data.IDataRecord, System.Data, Version=2.0.0.0," + 
                " Culture=neutral, PublicKeyToken=b77a5c561934e089", 
                "Contact", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);            
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "ContactID", 
                true, 
                "System.Int32", 
                "ContactID", 
                new IdentifierReference("ContactID", 
                    new EntityReference("AdventureWorks", "Contact", catalog), 
                    catalog), 
                null, 
                TypeDescriptorFlags.None, 
                null);            
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "LastName", 
                true, 
                "System.String", 
                "LastName", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);           
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "Phone", 
                true, 
                "System.String", 
                "Phone", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);            
            returnRootElementTypeDescriptor.ChildTypeDescriptors.Create(
                "EmailAddress", 
                true, 
                "System.String", 
                "EmailAddress", 
                null, 
                null, 
                TypeDescriptorFlags.None, 
                null);

            // Create the specific finder method instance
            getContactMethod.MethodInstances.Create(
                "GetContact", 
                true, 
                returnRootElementTypeDescriptor, 
                MethodInstanceType.SpecificFinder, 
                true);
        }
    }
}

See Also

Reference

BdcService

Services

GetAdministrationMetadataCatalog(SPServiceContext)

AdministrationMetadataCatalog

Model

Create(String, Boolean, AdministrationMetadataCatalog)

OwnedReferencedLobSystems

LobSystem

LobSystemInstance

Entity

ActivationError

Method

FilterDescriptor

Parameter

TypeDescriptor

MethodInstance

IdentifierReference

EntityReference