Creating (or Editing) an Object From a Template Programmatically

Sorry I haven’t been blogging in a while. I’ve been on a whirlwind tour around South Africa and Europe for the last three weeks presenting about Service Manager in one forum or another essentially every day.  It’s been exciting, but hasn’t left a lot of time for blogging.

I just needed to write some code today and had this question come up from our internal distribution list so I thought I would take a minute to answer it.  The question was how to create a new change request (or any object really) from a template programmatically.

Here you go:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;



namespace ApplyTemplate
{
    class Program
    {
        static void Main(string[] args)
        {
            EnterpriseManagementGroup emg = new EnterpriseManagementGroup("localhost");

            //You'll need to get the ObjectTemplateId GUID from the database after you have created it.  You can find it on the ObjectTemplate table by running a query like this:
            /*
             select MP.MPName,OT.* from ObjectTemplate as OT, ManagementPack as MP order by MP.MPName, OT.ObjectTemplateName 
             */
            ManagementPackObjectTemplate mpt = emg.Templates.GetObjectTemplate(new Guid("8B1AA102-F8A5-07D0-FC9A-2DB2A4FD5003"));  // <-- TODO: YOU'LL NEED TO REPLACE THIS GUID - SEE ABOVE

            //This is how you apply a template to a new object projection you want to create:
            EnterpriseManagementObjectProjection emop = new EnterpriseManagementObjectProjection(emg, mpt);
            emop.Overwrite();

            //This is how you apply a class-targeted template to an object.
            /*
            ManagementPackClass classChangeRequest = emg.EntityTypes.GetClass(new Guid("E6C9CF6E-D7FE-1B5D-216C-C3F5D2C7670C"));
            CreatableEnterpriseManagementObject cemo = new CreatableEnterpriseManagementObject(emg, classChangeRequest);
            cemo.ApplyTemplate(mpt);
            cemo.Commit();
            */
        }
    }
}

You can also call the .ApplyTemplate() method on a EnterpriseManaegmentObject or a EnterpriseManagementObjectProjection to update an object/projection that already exists.

The source code is attached in a Visual Studio application.

ApplyTemplate.zip