<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jakub@Work</title><link>http://blogs.msdn.com/jakuboleksy/default.aspx</link><description>Programming with System Center Service Manager and Operations Manager</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Service Manager 2010 Beta 2 Released</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/10/06/service-manager-beta-2-released.aspx</link><pubDate>Tue, 06 Oct 2009 02:32:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9903469</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9903469.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9903469</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9903469</wfw:comment><description>&lt;p&gt;We released our public Beta 2 on Friday and are busy making progress toward our RTM early next year. This is a fully public, feature complete Beta available on the Microsoft Connect site. The email sent from the Connect site to subscribers:&lt;/p&gt;  &lt;p&gt;The Service Manager team is very pleased to announce that Beta-2 for Service Manager 2010 is now available for download from connect. Details and links are below. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;To download, simply go to the Service Manager site on Connect &lt;a href="http://www.connect.microsoft.com/"&gt;www.connect.microsoft.com&lt;/a&gt;. Once you have successfully signed in, click the Downloads link, click &lt;strong&gt;Service Manager Beta-2 &lt;/strong&gt;and then select all of the following files on the download details page: &lt;/p&gt;  &lt;p&gt;· SMCDImage_amd64.exe&lt;/p&gt;  &lt;p&gt;· SMCDImage_x86.exe (32 bit console)&lt;/p&gt;  &lt;p&gt;· InstallOMMPs.exe &lt;/p&gt;  &lt;p&gt;· AuthoringTool.exe (authoring console)&lt;/p&gt;  &lt;p&gt;· SM_B2_Public.zip&lt;/p&gt;  &lt;p&gt;Click &lt;strong&gt;download&lt;/strong&gt; to begin the download process. Once the files have successfully downloaded, please be sure to read the release notes before installing the product as they contain some important information about the release&lt;/p&gt;  &lt;p&gt;You can also use the public forums for feedback and support, link below   &lt;br /&gt;&lt;a href="http://forums.microsoft.com/TechNet/ShowForum.aspx?ForumID=2066&amp;amp;SiteID=17"&gt;http://forums.microsoft.com/TechNet/ShowForum.aspx?ForumID=2066&amp;amp;SiteID=17     &lt;br /&gt;&lt;/a&gt;    &lt;br /&gt;Please read the “Preparing for Service Manager Deployment” section of the &lt;strong&gt;Installation and Configuration &lt;/strong&gt;Guide for step-by-step guidance on how to install and configure the product.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9903469" width="1" height="1"&gt;</description></item><item><title>Object Templates</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/06/26/object-templates.aspx</link><pubDate>Fri, 26 Jun 2009 23:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9805954</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9805954.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9805954</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9805954</wfw:comment><description>&lt;p&gt;In Service Manager, we have a variety of scenarios where we needed to capture partial object state and apply that state at a later time. The state captured is usually all or part of some IT process. For example, when creating a Change Request from the UI, the user is prompted with a set of templates to choose from, each representing a different kind of change request. These templates are stored as Object Templates in MPs and pre-define a set of values to populate the change request form with. &lt;/p&gt;  &lt;p&gt;Object templates can be used to store data about classes as well as projections. They are neither classes, nor objects, but rather blueprints (stored in management packs) for creating or modifying objects. In the attached MP you will find three different object templates. &lt;/p&gt;  &lt;div style="padding-bottom: 5px; padding-left: 5px; width: 1031px; padding-right: 5px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 5px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4c58ac8c-6b15-469c-bfb7-edd022ce5fb2" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border: #000080 1px solid; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; max-height: 300px; overflow: scroll; padding: 0"&gt;
&lt;ol style="background: #ffffff; margin: 0 0 0 25px; white-space: wrap"&gt;
&lt;li&gt; &lt;span style="color:#0000ff"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;ObjectTemplate&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;NFL.NFCDivision.Template&lt;/span&gt;"&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TypeID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;NFL.Division&lt;/span&gt;"&lt;span style="color:#0000ff"&gt; &amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Property[Type='NFL.Conference']/Name$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;NFC&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;     &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;ObjectTemplate&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;  &lt;p&gt;The first two set properties of a class. The Path notation is the same as used in projections, with the exception that you specify the particular property you want to set as well. You can specify as many or as few properties as you want, these objects don’t need to be complete, but we do verification to ensure property values make sense. &lt;/p&gt;  &lt;p&gt;Projections can also be defined:&lt;/p&gt;  &lt;div style="padding-bottom: 5px; padding-left: 5px; width: 1031px; padding-right: 5px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 5px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6f209e67-d4ff-4f6f-8862-7b01a1fc5705" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border: #000080 1px solid; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; max-height: 300px; overflow: scroll; padding: 0"&gt;
&lt;ol style="background: #ffffff; margin: 0 0 0 35px; white-space: wrap"&gt;
&lt;li&gt; &lt;span style="color:#0000ff"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;ObjectTemplate&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;NFL.New.Template&lt;/span&gt;"&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TypeID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;NFL.Conference.All&lt;/span&gt;"&lt;span style="color:#0000ff"&gt; &amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Property[Type='NFL.Conference']/Name$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;New Conference&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Object&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Path[Relationship='NFL.ConferenceHostsDivision']$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Property[Type='NFL.Conference']/Name$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;New Conference&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Property[Type='NFL.Division']/Name$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;New Division 1&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Object&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Path[Relationship='NFL.DivisionContainsTeam' TypeConstraint='NFC.Team']$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Property[Type='NFC.Team']/Name$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;New Team&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;         &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Object&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Object&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Object&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Path[Relationship='NFL.ConferenceHostsDivision']$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Property[Type='NFL.Conference']/Name$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;New Conference&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;$Target/Property[Type='NFL.Division']/Name$&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;New Division 2&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Object&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;     &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;ObjectTemplate&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;  &lt;p&gt;   &lt;br /&gt;These are similar, but allow you to define a hierarchy of objects that conform to the projection definition the object template references. Whenever you want to define a new object, you need to ensure the endpoint of the relationship is concrete, or you need to specify the TypeConstraint to indicate what class you want to create, as in the example above. &lt;/p&gt;  &lt;p&gt;In code, you can use these templates to create new objects or update existing objects:&lt;/p&gt;  &lt;div style="padding-bottom: 5px; padding-left: 5px; width: 1031px; padding-right: 5px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 5px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:270fc182-8d05-4f63-abbb-b4a51a116e05" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border: #000080 1px solid; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; max-height: 500px; overflow: scroll; padding: 0"&gt;
&lt;ol style="background: #ffffff; margin: 0 0 0 35px; white-space: wrap"&gt;
&lt;li&gt;             &lt;span style="color:#008000"&gt;// Connect to the management group&lt;/span&gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#2b91af"&gt;EnterpriseManagementGroup&lt;/span&gt; managementGroup =&lt;/li&gt;&lt;li&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EnterpriseManagementGroup&lt;/span&gt;(&lt;span style="color:#a31515"&gt;"localhost"&lt;/span&gt;);&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt; &lt;/li&gt;&lt;li&gt;             &lt;span style="color:#008000"&gt;// Get the management pack&lt;/span&gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#2b91af"&gt;ManagementPack&lt;/span&gt; nflManagementPack = &lt;/li&gt;&lt;li&gt;                 managementGroup.ManagementPacks.GetManagementPack(&lt;span style="color:#a31515"&gt;"NFL"&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Version&lt;/span&gt;(&lt;span style="color:#a31515"&gt;"1.0.0.0"&lt;/span&gt;));&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt; &lt;/li&gt;&lt;li&gt;             &lt;span style="color:#008000"&gt;// Get the object templates&lt;/span&gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#2b91af"&gt;ManagementPackObjectTemplate&lt;/span&gt; nfcDivisionTemplate = &lt;/li&gt;&lt;li&gt;                 nflManagementPack.GetObjectTemplate(&lt;span style="color:#a31515"&gt;"NFL.NFCDivision.Template"&lt;/span&gt;);&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#2b91af"&gt;ManagementPackObjectTemplate&lt;/span&gt; afcDivisionTemplate = &lt;/li&gt;&lt;li&gt;                 nflManagementPack.GetObjectTemplate(&lt;span style="color:#a31515"&gt;"NFL.AFCDivision.Template"&lt;/span&gt;);&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#2b91af"&gt;ManagementPackObjectTemplate&lt;/span&gt; nflTemplate = &lt;/li&gt;&lt;li&gt;                 nflManagementPack.GetObjectTemplate(&lt;span style="color:#a31515"&gt;"NFL.New.Template"&lt;/span&gt;);&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt; &lt;/li&gt;&lt;li&gt;             &lt;span style="color:#008000"&gt;// Create a new NFC division using the template&lt;/span&gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#2b91af"&gt;CreatableEnterpriseManagementObject&lt;/span&gt; newNfcDivision = &lt;/li&gt;&lt;li&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CreatableEnterpriseManagementObject&lt;/span&gt;(managementGroup, nfcDivisionTemplate);&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt; &lt;/li&gt;&lt;li&gt;             &lt;span style="color:#008000"&gt;// Change it to an AFC division&lt;/span&gt;&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             newNfcDivision.ApplyTemplate(afcDivisionTemplate);&lt;/li&gt;&lt;li&gt; &lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#008000"&gt;// Create a new projection from a template&lt;/span&gt;&lt;/li&gt;&lt;li&gt;             &lt;span style="color:#2b91af"&gt;EnterpriseManagementObjectProjection&lt;/span&gt; newNfl = &lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EnterpriseManagementObjectProjection&lt;/span&gt;(managementGroup, nflTemplate);&lt;/li&gt;&lt;li&gt; &lt;/li&gt;&lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#008000"&gt;// You can also apply a template to an existing projection&lt;/span&gt;&lt;/li&gt;&lt;li&gt;             newNfl.ApplyTemplate(nflTemplate);&lt;/li&gt;&lt;li style="background: #f3f3f3"&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9805954" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/jakuboleksy/attachment/9805954.ashx" length="5051" type="text/xml" /></item><item><title>Categorizing Management Pack Elements</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/06/03/categorizing-management-pack-elements.aspx</link><pubDate>Wed, 03 Jun 2009 18:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9691622</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9691622.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9691622</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9691622</wfw:comment><description>&lt;P&gt;If you are familiar with Management Packs and their elements in Operations Manager, you'll know that there were a few elements that had a "Category" attribute whose value was fixed from an enumeration defined in the schema. While this worked, it was quite limiting. For one, the enumeration itself did not make a lot of sense globally. There were values in the enumeration that only applied to some of the elements that used it. Next, it only allowed for some elements to be categorized and only once. Finally, the enumeration was not extensible. &lt;/P&gt;
&lt;P&gt;In Service Manager we've added the ability to categorize any Management Pack element via an extensible mechanism that leverages the new concept of enumerations as defined in management packs. Enumerations are essentially hierarchal extensible lists that are defined in management packs. They can be used both as values for class properties as well as values for categorization of elements. In this article, I'll be discussing the latter. &lt;/P&gt;
&lt;P&gt;I've updated the NFL management pack I have been using and introduced a new enumeration and some categories. First, you'll find the following enumeration defined:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;EnumerationTypes&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;EnumerationValue&lt;/SPAN&gt; &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.VisibleToCallers"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Accessibility&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="Public"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;EnumerationTypes&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;I can define enumerations to mean just about anything I want as the consumer of these enumerations and subsequent categories defines their behavior. In this case, I am defining an enumeration that categorizes elements as visible to callers via some API that I will be providing.&lt;/P&gt;
&lt;P&gt;Once I have defined my enumeration, the next step is to categorize my elements as "in" the value. For this, I need to define category elements:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;Categories&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;Category&lt;/SPAN&gt; &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Visibility1"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Target&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Conference"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Value&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.VisibleToCallers"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;/&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;Category&lt;/SPAN&gt; &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Visibility2"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Target&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Division"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Value&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.VisibleToCallers"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;/&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;Category&lt;/SPAN&gt; &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Visibility3"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Target&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Team"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Value&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.VisibleToCallers"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;Categories&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;As you can see, I've placed three classes into my enumeration, thus categorizing them. But what does this mean from an API perspective? Really, it doesn't mean anything unless the consumer honors the categorization. As an example, the Service Manager UI uses various enumerations as defined in our management packs to categorize elements, such as console tasks or views, to control their visibility behavior in the UI. &lt;/P&gt;
&lt;P&gt;Next, I'll demonstrate how a caller of the API can use this categorization. In the following sample, after importing the attached management pack, I retrieve the defined enumeration and generate criteria from it to filter out the classes I want to retrieve based on the categorization:&lt;/P&gt;&lt;PRE class=csharpcode&gt;            &lt;SPAN class=rem&gt;// Connect to the management group&lt;/SPAN&gt;
            EnterpriseManagementGroup managementGroup =
                &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EnterpriseManagementGroup(&lt;SPAN class=str&gt;"localhost"&lt;/SPAN&gt;);

            &lt;SPAN class=rem&gt;// Get the management pack&lt;/SPAN&gt;
            ManagementPack nflManagementPack = 
                managementGroup.ManagementPacks.GetManagementPack(&lt;SPAN class=str&gt;"NFL"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Version(&lt;SPAN class=str&gt;"1.0.0.0"&lt;/SPAN&gt;));

            &lt;SPAN class=rem&gt;// Get the type enumeration value&lt;/SPAN&gt;
            ManagementPackEnumeration showToCallersEnumeration =
                nflManagementPack.GetEnumeration(&lt;SPAN class=str&gt;"NFL.VisibleToCallers"&lt;/SPAN&gt;);

            &lt;SPAN class=rem&gt;// Create an in statement using the category property&lt;/SPAN&gt;
            &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; classCriteria = &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.Format(&lt;SPAN class=str&gt;@"&amp;lt;Criteria xmlns="&lt;/SPAN&gt;&lt;SPAN class=str&gt;"http://Microsoft.EnterpriseManagement.Core.Criteria/"&lt;/SPAN&gt;&lt;SPAN class=str&gt;"&amp;gt;
                                        &amp;lt;Expression&amp;gt;
                                            &amp;lt;In&amp;gt;
                                              &amp;lt;GenericProperty&amp;gt;Category&amp;lt;/GenericProperty&amp;gt;
                                              &amp;lt;Values&amp;gt;
                                                &amp;lt;Value&amp;gt;{0}&amp;lt;/Value&amp;gt;
                                              &amp;lt;/Values&amp;gt;
                                            &amp;lt;/In&amp;gt;
                                          &amp;lt;/Expression&amp;gt;
                                        &amp;lt;/Criteria&amp;gt;"&lt;/SPAN&gt;, showToCallersEnumeration.Id);

            &lt;SPAN class=rem&gt;// Create the criteria object&lt;/SPAN&gt;
            ManagementPackClassCriteria classesVisibleToCallersCriteria = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ManagementPackClassCriteria(classCriteria);
            
            &lt;SPAN class=rem&gt;// Get classes using criteria&lt;/SPAN&gt;
            IList&amp;lt;ManagementPackClass&amp;gt; classesVisibleToCallers = managementGroup.EntityTypes.GetClasses(classesVisibleToCallersCriteria);&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;&lt;STRONG&gt;Important Note: &lt;/STRONG&gt;The criteria behaves in the following way with respect to inclusion and exclusion of categories. If you generate a query as shown earlier, it will return any class that is in this category, regardless if it is in other categories. If you change the query to ask for classes where category is not of a particular id, it will exclude the classes that are ONLY in that particular category; so if a class is in category A and B and you ask for classes not in B, you will still get the class back because A is not in B. If a class is only in category B and you ask for classes not in B, you will not get it back because that class is exclusively in B and thus NOT IN B is false. Even if this didn't make sense to you (I had to read it back several times myself :-) ), essentially what this means is that NOT EQUAL to a particular category queries just don't work the way you would expect so please don't use them or understand how they work before you do. To mitigate this problem, we are planning on caching categories client-side so users can quickly do filtering post-query for "NOT" semantics. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9691622" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/jakuboleksy/attachment/9691622.ashx" length="3665" type="text/xml" /></item><item><title>New Criteria</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/05/07/new-criteria.aspx</link><pubDate>Thu, 07 May 2009 02:55:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592388</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9592388.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9592388</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9592388</wfw:comment><description>&lt;p&gt;Well, we're back from MMS which was pretty successful for Service Manager in general. In a lot of ways, it was a coming out party of sorts as we were able to demonstrate a ton of functionality about the product and really show how well it is coming along. My session with Travis went great and I really feel we did a solid job in speaking to and demonstrating the power of the Service Manager platform. The team is heads down in Beta 2 right now as we push for an early Fall release. Beta 2 is very exciting for us because at that point the product is basically complete from a feature perspective and customers will be able to play with as close to the final bits as they've ever had. I really hope we get a lot more people interested in customization and extension at that time and I'll be excited to blog about a lot of the new features we're introducing in Beta 2 from an SDK perspective.&lt;/p&gt;  &lt;p&gt;In this post, I wanted to talk about our new criteria a little bit and introduce you to the new format and some of the new concepts. If you are familiar with OM, the criteria there was very similar to a WHERE clause in SQL. While this was very friendly from an end-user perspective, it actually was quite burdensome from a developer perspective, both in generating complicated criteria and for us in parsing it and ensuring its uniqueness. For Service Manager 2010 we decided to prioritize power and ease of programmatic manipulation over readability and the ability to quickly script the criteria. Criteria is used in for querying for a variety of objects in the SDK. Here's I'll use examples mostly around the instance and projection space. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Simple Expression       &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;A simple expression just compares a property to a value. In this example we are comparing PropertyName on ClassName to the value 3. &lt;/p&gt;  &lt;pre class="csharpcode"&gt;               &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;$Target/Property[Type='ClassName']/PropertyName$&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Equal&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;/pre&gt;

&lt;p&gt;For projections, a simple expression would look like this, where the property is actually a path:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;$Target/Path[Relationship='RelationshipName']/Property[Type='ClassName']/PropertyName$&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Equal&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Also, rather than using names, you can use Ids in the criteria:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;$Target/Property[Type='b982d3ec-96e0-4901-b1d9-a06196acf0bc']/b982d3ec-96e0-4901-b1d9-a06196acf0bc$&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Equal&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;$Target/Path[Relationship='b982d3ec-96e0-4901-b1d9-a06196acf0bc']/&lt;br /&gt;Property[Type='b982d3ec-96e0-4901-b1d9-a06196acf0bc']/b982d3ec-96e0-4901-b1d9-a06196acf0bc$&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Equal&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Unary/Regex Expression
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;These are the same as the simple expressions, but instead Unary and RegEx operators are supported. RegExExpression supports ContainsSubstring, MatchesWildcard, MatchesRegularExpression, DoesNotContainSubstring, DoesNotMatchWildcard and DoesNotMatchRegularExpression. UnaryExpression supports IsNull and IsNotNull.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Contains/NotContains/ContainedBy/NotContainedBy Expression
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;These expressions allow a traversal to be made either down or up containment to either include or exclude results based the existence of a relationship to other instances. The concept here is similar to an EXISTS query in SQL. &lt;/p&gt;

&lt;pre class="csharpcode"&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Contains&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="rem"&gt;&amp;lt;!-- A Contains query from a particular node in the projection; this can also just drop path and the implicit path is the seed --&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;$Target/Path[Relationship='RelationshipName']$&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Class&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;$MPElement[Name='System!System.Computer']$&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Class&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Expression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;$Target/Property[Type='System!System.Computer']/FQDN$&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionLeft&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Equal&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;ComputerName&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ValueExpressionRight&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SimpleExpression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Expression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Contains&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;The Path element indicates where within the context of the criteria you want to perform the containment based query. If the path is excluded, it means that you want the containment query to be done on the target of the criteria, namely the projection seed class or the class in the case of regular instance queries.&lt;/p&gt;

&lt;p&gt;As a more concrete example, given an Incident projection with System.Incident as the seed and a single related owner System.User, one can do containment based queries on either the incident or the user. If a query like &amp;#8220;Give me all incidents that are contained by the &amp;#8216;Tier 1 Incident Group&amp;#8217;&amp;#8221;, the path element would be excluded, the Class element would point to the Incident Group type and the expression would be empty. If there were some criteria on that group that needed to be matched, that expression would be used for that. If the query was like &amp;#8220;Give me incidents that have a owner that is contained by &amp;#8220;Tier 1 Users Group&amp;#8221;, the path element would need to be populated pointing to System.User.&lt;/p&gt;

&lt;p&gt;It is important to note that the path element indicates where in the context of the criteria you want the containment query to apply, while the class and criteria indicate what you are searching for in that containment space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;And/Or Expression
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;These expressions allow you to combine other expressions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;In Expression
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;And finally we support a basic IN clause for use with Guid fields only. The other thing to note here is that I am using a GenericProperty instead of Property element. This allows you to refer to generic properties of instances that aren't modeled. This property also has a Path attribute that allows you to point to a node in a projection for which you want the generic property to apply.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Expression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="rem"&gt;&amp;lt;!-- Simple IN Clause (GUID support only) --&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;In&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;GenericProperty&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Id&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;GenericProperty&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Values&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;b982d3ec-96e0-4901-b1d9-a06196acf0bc&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;b982d3ec-96e0-4901-b1d9-a06197acf0bc&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;b982d3ec-96e0-4901-b1d9-a06198acf0bc&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Values&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;In&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Expression&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9592388" width="1" height="1"&gt;</description></item><item><title>MMS 2009</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/04/14/mms-2009.aspx</link><pubDate>Tue, 14 Apr 2009 19:16:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9548716</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9548716.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9548716</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9548716</wfw:comment><description>&lt;p&gt;I apologize for not posting lately, we've been really heads down on Beta 2 and working on our sessions for MMS. I plan to post more regularly again when things die down a bit, but in the meantime just wanted to let you know that I'll be at MMS doing the session below. If anyone is also going to be there, come check out our talk.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;strong&gt;SO23 Customizing and Extending Service Manager      &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;Speaker(s): Jakub Oleksy, Travis Wright      &lt;br /&gt;Track(s): Operations Management       &lt;br /&gt;Session Type(s): Breakout Session       &lt;br /&gt;Products(s): Operations Manager 2007, Service Manager&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;A technical drill-down on the customization capabilities of Service Manager: This session will articulate how to extend and deliver Service Manager through the delivery of management packs. We will demonstrate the authoring tools to learn how to create workflows, customize templates and extend the configuration management database &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9548716" width="1" height="1"&gt;</description></item><item><title>Getting and Working With Type Projections - Basic</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/03/04/getting-and-working-with-type-projections-basic.aspx</link><pubDate>Wed, 04 Mar 2009 04:47:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9457847</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9457847.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9457847</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9457847</wfw:comment><description>&lt;p&gt;In my &lt;a href="http://blogs.msdn.com/jakuboleksy/archive/2009/02/04/more-with-type-projections.aspx"&gt;last post&lt;/a&gt; in gave you a more in-depth look at creating type projections in Service Manager. In this post, I'd like to provide you with some basic examples on how you can retrieve and work with instances of type projections. I'll be using the same Management Pack and data set from the previous post.&lt;/p&gt;  &lt;p&gt;On the Instances interface you will find a few methods for retrieving instances of EnterpriseManagementObjectProjection. Post Beta 1, we've actually cleaned up this interface significantly so I don't want to concentrate too much on the actual method call, but rather the parameters to it and working with the result. &lt;/p&gt;  &lt;p&gt;In Beta 1 the method you would use looks like this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;IList&amp;lt;EnterpriseManagementObjectProjection&amp;gt; GetObjectProjections&amp;lt;T&amp;gt;(ManagementPackTypeProjection managementPackTypeProjection, &lt;br /&gt;ObjectProjectionCriteria criteria, ObjectQueryOptions queryOptions) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : EnterpriseManagementObject;&lt;/pre&gt;

&lt;p&gt;Post Beta 1, this method is replaced by:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;IObjectProjectionReader&amp;lt;T&amp;gt; GetObjectProjectionReader&amp;lt;T&amp;gt;(ObjectProjectionCriteria criteria, ObjectQueryOptions queryOptions)
            &lt;span class="kwrd"&gt;where&lt;/span&gt; T : EnterpriseManagementObject;&lt;/pre&gt;

&lt;p&gt;The ManagementPackTypeProjection from the first simply gets rolled into the ObjectProjectionCriteria object and the return type gets changed to support buffered reads to help with performance, however, IObjectProjectionReader can actually be used like an IList (although it doesn't implement IList); I'll discuss the reader more once we ship Beta 2 later this year. My examples below will use the latest code since that will be around longer; hopefully it is easily transferable for you to the Beta 1 API.&lt;/p&gt;

&lt;p&gt;The first thing you need in order to get a type projection instance, is the type projection definition. This narrows down the types of instances you will get back to those that fit the structure of the type projection:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;      &lt;span class="rem"&gt;// Connect to the management group&lt;/span&gt;
      EnterpriseManagementGroup managementGroup =
            &lt;span class="kwrd"&gt;new&lt;/span&gt; EnterpriseManagementGroup(&lt;span class="str"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;);

      &lt;span class="rem"&gt;// Get the management pack&lt;/span&gt;
      ManagementPack nflManagementPack = 
            managementGroup.ManagementPacks.GetManagementPack(&lt;span class="str"&gt;&amp;quot;NFL&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; Version(&lt;span class="str"&gt;&amp;quot;1.0.0.0&amp;quot;&lt;/span&gt;));

      &lt;span class="rem"&gt;// Get the type projection&lt;/span&gt;
      ManagementPackTypeProjection nflProjection =
            nflManagementPack.GetTypeProjection(&lt;span class="str"&gt;&amp;quot;NFL.Conference.All&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;p&gt;Very simply you can retrieve projections by specifying the type:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;IObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt; objectProjections =
      managementGroup.Instances.GetObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt;(
      &lt;span class="kwrd"&gt;new&lt;/span&gt; ObjectProjectionCriteria(nflProjection), ObjectQueryOptions.Default);&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This will retrieve all projections in the system of that structure. A projection exists if the root object of the projection exists, regardless of whether any of the components are found. If you want to limit your result somehow, you will need to specify criteria to limit your result set. One example of simple criteria you could add is matching on one of the generic properties of the root object:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; displayNameCriteria = &lt;span class="str"&gt;@&amp;quot;&amp;lt;Criteria xmlns=&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;http://Microsoft.EnterpriseManagement.Core.Criteria/&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;&amp;gt;
                  &amp;lt;Expression&amp;gt;
                    &amp;lt;SimpleExpression&amp;gt;
                      &amp;lt;ValueExpressionLeft&amp;gt;
                        &amp;lt;GenericProperty&amp;gt;DisplayName&amp;lt;/GenericProperty&amp;gt;
                      &amp;lt;/ValueExpressionLeft&amp;gt;
                      &amp;lt;Operator&amp;gt;Equal&amp;lt;/Operator&amp;gt;
                      &amp;lt;ValueExpressionRight&amp;gt;
                        &amp;lt;Value&amp;gt;National Football Conference&amp;lt;/Value&amp;gt;
                      &amp;lt;/ValueExpressionRight&amp;gt;
                    &amp;lt;/SimpleExpression&amp;gt;
                  &amp;lt;/Expression&amp;gt;
                &amp;lt;/Criteria&amp;gt;&amp;quot;&lt;/span&gt;;

            IObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt; objectProjectionsByDisplayName =
                 managementGroup.Instances.GetObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt;(
                     &lt;span class="kwrd"&gt;new&lt;/span&gt; ObjectProjectionCriteria(displayNameCriteria, nflProjection, managementGroup), ObjectQueryOptions.Default);&lt;/pre&gt;

&lt;p&gt;This would limit the results to any projections whose root object had a display name matching &amp;quot;National Football Conference.&amp;quot; The list of available generic properties for Service Manager is Id, Name, DisplayName, LastModified and new post Beta 1 CreatedDate and LastModifiedBy. &lt;/p&gt;

&lt;p&gt;It is also possible to query on type specific properties of the root object:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyCriteria = &lt;span class="str"&gt;@&amp;quot;&amp;lt;Criteria xmlns=&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;http://Microsoft.EnterpriseManagement.Core.Criteria/&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;&amp;gt;
                  &amp;lt;Expression&amp;gt;
                    &amp;lt;SimpleExpression&amp;gt;
                      &amp;lt;ValueExpressionLeft&amp;gt;
                        &amp;lt;Property&amp;gt;$Target/Property[Type='NFL.Conference']/Name$&amp;lt;/Property&amp;gt;
                      &amp;lt;/ValueExpressionLeft&amp;gt;
                      &amp;lt;Operator&amp;gt;Equal&amp;lt;/Operator&amp;gt;
                      &amp;lt;ValueExpressionRight&amp;gt;
                        &amp;lt;Value&amp;gt;NFC&amp;lt;/Value&amp;gt;
                      &amp;lt;/ValueExpressionRight&amp;gt;
                    &amp;lt;/SimpleExpression&amp;gt;
                  &amp;lt;/Expression&amp;gt;
                &amp;lt;/Criteria&amp;gt;&amp;quot;&lt;/span&gt;;

            IObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt; objectProjectionsByProperty =
                 managementGroup.Instances.GetObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt;(
                     &lt;span class="kwrd"&gt;new&lt;/span&gt; ObjectProjectionCriteria(propertyCriteria, nflProjection, nflManagementPack, managementGroup), ObjectQueryOptions.Default);&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;Criteria can get more complicated than the above examples, including specifying criteria on the individual components of the projection, but an in-depth discussion will happen in a later post. &lt;/p&gt;

&lt;p&gt;Once you get an EnterpriseManagementObjectProjection, you essentially have a collection of instances organized in a hierarchy as defined by the type projection. If you run the following code:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;            foreach&lt;/span&gt; (EnterpriseManagementObjectProjection projection &lt;span class="kwrd"&gt;in&lt;/span&gt; objectProjections)
            {
                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Conference: {0}&amp;quot;&lt;/span&gt;, projection.Object.DisplayName);
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (IComposableProjection division &lt;span class="kwrd"&gt;in&lt;/span&gt; projection[nflConferenceContainsDivision.Target])
                {
                    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tDivision: {0}&amp;quot;&lt;/span&gt;, division.Object.DisplayName);
                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (IComposableProjection team &lt;span class="kwrd"&gt;in&lt;/span&gt; division[divisionContainTeam.Target])
                    {
                        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\t\tTeam: {0}&amp;quot;&lt;/span&gt;, team.Object.DisplayName);
                        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (IComposableProjection coach &lt;span class="kwrd"&gt;in&lt;/span&gt; team[coachCoachesTeam.Source])
                        {
                            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\t\t\tCoach: {0}&amp;quot;&lt;/span&gt;, coach.Object.DisplayName);
                        }
                    }
                }
            }&lt;/pre&gt;

&lt;p&gt;You'll get a result that shows you the structure of the projection in memory:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Conference: American Football Conference
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: AFC West

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Oakland Raiders

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Kansas City Chiefs

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: San Diego Chargers

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Denver Broncos

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: AFC East

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Buffalo Bills

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: New England Patriots

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: New York Jets

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Miami Dolphins

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: AFC South

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Houston Texans

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Jacksonville Jaguars

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Tennessee Titans

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Indianapolis Colts

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: AFC North

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Cleveland Browns

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Pittsburgh Steelers

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Baltimore Ravens

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Cincinnati Bengals

    &lt;br /&gt;Conference: National Football Conference

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: NFC North

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Green Bay Packers

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Chicago Bears

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Coach: Lovie Smith

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Detroit Lions

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Minnesota Vikings

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: NFC South

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Carolina Panthers

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Atlanta Falcons

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Tampa Bay Buccaneers

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: New Orleans Saints

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: NFC East

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: New York Giants

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Dallas Cowboys

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Philadelphia Eagles

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Washington Redskins

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Division: NFC West

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: St. Louis Rams

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Seattle Seahawks

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: Arizona Cardinals

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Team: San Francisco 49ers&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the line is indented, it indicates a jump across a relationship. The hierarchy is organized by the relationship types that bring in each component; put another way, as you traverse from parent to child you are traversing a relationship of a particular relationship type in one direction. So, as you go from &lt;em&gt;American Football Conference&lt;/em&gt; to &lt;em&gt;AFC West&lt;strong&gt;, &lt;/strong&gt;&lt;/em&gt;you are moving from &amp;quot;Conference&amp;quot; to &amp;quot;Division&amp;quot; on the NFL.ConferenceHostsDivision relationship type. &lt;/p&gt;

&lt;p&gt;Each node in an EnterpriseManagementObjectProjection implements IComposableProjection which offers various ways at traversing through the hierarchy. The object is also IEnumerable&amp;lt;KeyValuePair&amp;lt;ManagementPackRelationshipEndpoint, IComposableProjection&amp;gt;&amp;gt;, which shows that the hierarchy is organized by the relationship endpoint that brings each node in. You also get a pointer to the actual object at the node:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// The current object in the projection.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        EnterpriseManagementObject Object
        {
            get;
        }&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The role that brought the current object into the current projection:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Gets the role of this projection, relative to its parent.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
        ManagementPackRelationshipEndpoint ObjectRole
        {
            get;
        }&lt;/pre&gt;

&lt;p&gt;The object that brought the current object into the current projection:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// The parent object, if any, for the current object in the projection.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IComposableProjection ParentObject
        {
            get;
        }&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;And a few indexers to aid in traversal, one of which we used in the sample above:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Access all IComposableProjection elements of this IComposableProjection, optionally recursively.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IList&amp;lt;IComposableProjection&amp;gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;[TraversalDepth traversalDepth]
        {
            get;
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Access IComposableProjection elements of this IComposableProjection, by role name.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IList&amp;lt;IComposableProjection&amp;gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;[&lt;span class="kwrd"&gt;string&lt;/span&gt; roleName]
        {
            get;
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Access IComposableProjection elements of this IComposableProjection, by role name.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IList&amp;lt;IComposableProjection&amp;gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;[&lt;span class="kwrd"&gt;string&lt;/span&gt; roleName, ManagementPackClass classConstraint]
        {
            get;
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Gets the IComposableProjection child of the projection by id of the contained object&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IComposableProjection &lt;span class="kwrd"&gt;this&lt;/span&gt;[&lt;span class="kwrd"&gt;string&lt;/span&gt; roleName, Guid id]
        {
            get;
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Access IComposableProjection elements of this IComposableProjection, by relationship role.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IList&amp;lt;IComposableProjection&amp;gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;[ManagementPackRelationshipEndpoint role]
        {
            get;
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Access IComposableProjection elements of this IComposableProjection, by relationship role and a class constraint.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IList&amp;lt;IComposableProjection&amp;gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;[ManagementPackRelationshipEndpoint role, ManagementPackClass classConstraint]
        {
            get;
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Gets the IComposableProjection child of the projection by id of the contained object&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        IComposableProjection &lt;span class="kwrd"&gt;this&lt;/span&gt;[ManagementPackRelationshipEndpoint role, Guid id]
        {
            get;
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;In future posts I'll discuss more advanced concepts around working with projections instances (they're IXPathNavigable!), a deeper look at criteria, creating and editing projections and a lot more. I hope that by the time Beta 2 ships later this year to have a comprehensive list of topics that help introduce you to new API concepts. &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9457847" width="1" height="1"&gt;</description></item><item><title>More with Type Projections</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/02/04/more-with-type-projections.aspx</link><pubDate>Wed, 04 Feb 2009 20:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9396144</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9396144.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9396144</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9396144</wfw:comment><description>&lt;p&gt;In my &lt;a href="http://blogs.msdn.com/jakuboleksy/archive/2009/01/20/getting-started-with-type-projections.aspx" mce_href="http://blogs.msdn.com/jakuboleksy/archive/2009/01/20/getting-started-with-type-projections.aspx"&gt;last post&lt;/a&gt; I introduced you to a new concept in the Service Manager infrastructure called Type Projections. Here, I want to expand on my previous example and discuss type projection structure in more depth. I've attached the management pack that I will be discussing (NFL.xml) and there is reference code at the bottom of this post for populating sample data.&lt;/p&gt;  &lt;p&gt;Type projection definitions allow users to create virtual object collections through any relationships found in the system. In the previous post I showed how a projection could bring hosted and host objects together in one go. The following projection expands on that example by introducing System.Containment and System.Reference relationships, as well as introducing the concepts of type constraints and relationship direction:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TypeProjections&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TypeProjection&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;NFL.Conference.All&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Accessibility&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Public&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;NFL.Conference&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Component&lt;/span&gt; &lt;span class="attr"&gt;Alias&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Division&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Target/Path[Relationship='NFL.ConferenceHostsDivision']$&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Component&lt;/span&gt; &lt;span class="attr"&gt;Alias&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;AFCTeam&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Target/Path[Relationship='NFL.DivisionContainsTeam' SeedRole='Source' TypeConstraint='AFC.Team']$&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Component&lt;/span&gt; &lt;span class="attr"&gt;Alias&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;NFCTeam&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Target/Path[Relationship='NFL.DivisionContainsTeam' SeedRole='Source' TypeConstraint='NFC.Team']$&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Component&lt;/span&gt; &lt;span class="attr"&gt;Alias&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Coach&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Target/Path[Relationship='NFL.CoachCoachesTeam' SeedRole='Target']$&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Component&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Component&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TypeProjection&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TypeProjections&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Added to the Division component from the previous post, I've now introduced two components that bring in all the teams in the NFL. I've defined my NFL.Team class as abstract and created concrete classes, AFC.Team and NFC.Team. I've also created a relationship derived from System.Containment associating an NFL.Division to an NFL.Team. Of note is that this relationship ends with an abstract class as the target endpoint. While this is supported by type projection definitions, the projection I have defined actually demonstrates the ability to constraint a component to a particular class. The two components, AFCTeam and NFCTeam each share a relationship, however, they each add a different type constraint. Given something can't be an NFCTeam and AFCTeam at the same time, these components will introduce unique sets of data.&lt;/p&gt;

&lt;p&gt;If I were to change the AFCTeam component to remove the type constraint, that component would return all NFL.Team instances while the NFCTeam component would return only those NFL.Team objects that are NFC.Teams as well. &lt;/p&gt;

&lt;p&gt;Next, I added a System.Reference relationship between NFL.Coach and NFL.Team. Notice that the coach is the source of that relationship. If I want to include all coaches for NFC.Teams, I need to indicate in the type projection definition that I want to traverse the relationship from target to source. This is done via the SeedRole attribute. The &amp;quot;Seed&amp;quot; refers to the parent component of the current component; the attribute describes which role the seed should play relative to the relationship used in the current component. In the sample, the relationship is NFL.CoachCoachesTeam and the seed (NFCTeam) is the target of that relationship and hence SeedRole='Target'.&lt;/p&gt;

&lt;p&gt;Traversing this structure is similar to the example in my previous post:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            &lt;span class="rem"&gt;// Connect to the management group&lt;/span&gt;
            EnterpriseManagementGroup managementGroup =
                &lt;span class="kwrd"&gt;new&lt;/span&gt; EnterpriseManagementGroup(&lt;span class="str"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;);

            &lt;span class="rem"&gt;// Get the management pack&lt;/span&gt;
            ManagementPack nflManagementPack = 
                managementGroup.ManagementPacks.GetManagementPack(&lt;span class="str"&gt;&amp;quot;NFL&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; Version(&lt;span class="str"&gt;&amp;quot;1.0.0.0&amp;quot;&lt;/span&gt;));

            &lt;span class="rem"&gt;// Get the type projection&lt;/span&gt;
            ManagementPackTypeProjection nflProjection =
                nflManagementPack.GetTypeProjection(&lt;span class="str"&gt;&amp;quot;NFL.Conference.All&amp;quot;&lt;/span&gt;);

            &lt;span class="rem"&gt;// Get the relationship types&lt;/span&gt;
            ManagementPackRelationship nflConferenceContainsDivision =
                nflManagementPack.GetRelationship(&lt;span class="str"&gt;&amp;quot;NFL.ConferenceHostsDivision&amp;quot;&lt;/span&gt;);

            ManagementPackRelationship divisionContainTeam =
                nflManagementPack.GetRelationship(&lt;span class="str"&gt;&amp;quot;NFL.DivisionContainsTeam&amp;quot;&lt;/span&gt;);

            ManagementPackRelationship coachCoachesTeam =
                nflManagementPack.GetRelationship(&lt;span class="str"&gt;&amp;quot;NFL.CoachCoachesTeam&amp;quot;&lt;/span&gt;);

            IObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt; objectProjections =
                managementGroup.Instances.GetObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt;(
                    &lt;span class="kwrd"&gt;new&lt;/span&gt; ObjectProjectionCriteria(nflProjection), ObjectQueryOptions.Default);

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (EnterpriseManagementObjectProjection projection &lt;span class="kwrd"&gt;in&lt;/span&gt; objectProjections)
            {
                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Conference: {0}&amp;quot;&lt;/span&gt;, projection.Object.DisplayName);
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (IComposableProjection division &lt;span class="kwrd"&gt;in&lt;/span&gt; projection[nflConferenceContainsDivision.Target])
                {
                    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tDivision: {0}&amp;quot;&lt;/span&gt;, division.Object.DisplayName);
                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (IComposableProjection team &lt;span class="kwrd"&gt;in&lt;/span&gt; division[divisionContainTeam.Target])
                    {
                        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\t\tTeam: {0}&amp;quot;&lt;/span&gt;, team.Object.DisplayName);
                        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (IComposableProjection coach &lt;span class="kwrd"&gt;in&lt;/span&gt; team[coachCoachesTeam.Source])
                        {
                            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\t\t\tCoach: {0}&amp;quot;&lt;/span&gt;, coach.Object.DisplayName);
                        }
                    }
                }
            }&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;When we traverse from team to coach, we use the .Source property of the relationship which corresponds to the SeedRole description in the type projection definition. As part of traversing the projection, think of the role as where you are traversing to; in this example you are traversing from the team (the .Target property) to the coach (the .Source property). &lt;/p&gt;

&lt;p&gt;When traversing from divisions to teams, I am using the abstract .Target property of the NFL.DivisionContainsTeam relationship. Type constraints are not expressed in the traversal mechanism for these objects; the key from going to one component to another is the relationship endpoint, save any type constraints. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference Code&lt;/strong&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;           &lt;span class="rem"&gt;// Connect to the management group&lt;/span&gt;
            EnterpriseManagementGroup managementGroup =
                &lt;span class="kwrd"&gt;new&lt;/span&gt; EnterpriseManagementGroup(&lt;span class="str"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;);

            &lt;span class="rem"&gt;// Import the management pack&lt;/span&gt;
            ManagementPack managementPack = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManagementPack(&lt;span class="str"&gt;&amp;quot;NFL.xml&amp;quot;&lt;/span&gt;);
            managementGroup.ManagementPacks.ImportManagementPack(managementPack);
            managementPack = managementGroup.ManagementPacks.GetManagementPack(managementPack.Id);

            &lt;span class="rem"&gt;// Populate Data&lt;/span&gt;
            IncrementalDiscoveryData dataTransaction = &lt;span class="kwrd"&gt;new&lt;/span&gt; IncrementalDiscoveryData();

            &lt;span class="rem"&gt;// Get System.Entity class&lt;/span&gt;
            ManagementPackClass systemEntity = managementGroup.EntityTypes.GetClass(SystemClass.Entity);

            &lt;span class="rem"&gt;// Conferences&lt;/span&gt;
            ManagementPackClass conference = managementPack.GetClass(&lt;span class="str"&gt;&amp;quot;NFL.Conference&amp;quot;&lt;/span&gt;);
            CreatableEnterpriseManagementObject nfc = &lt;span class="kwrd"&gt;new&lt;/span&gt; CreatableEnterpriseManagementObject(managementGroup, conference);
            nfc[conference, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value = &lt;span class="str"&gt;&amp;quot;NFC&amp;quot;&lt;/span&gt;;
            nfc[systemEntity, &lt;span class="str"&gt;&amp;quot;DisplayName&amp;quot;&lt;/span&gt;].Value = &lt;span class="str"&gt;&amp;quot;National Football Conference&amp;quot;&lt;/span&gt;;
            dataTransaction.Add(nfc);

            CreatableEnterpriseManagementObject afc = &lt;span class="kwrd"&gt;new&lt;/span&gt; CreatableEnterpriseManagementObject(managementGroup, conference);
            afc[conference, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value = &lt;span class="str"&gt;&amp;quot;AFC&amp;quot;&lt;/span&gt;;
            afc[systemEntity, &lt;span class="str"&gt;&amp;quot;DisplayName&amp;quot;&lt;/span&gt;].Value = &lt;span class="str"&gt;&amp;quot;American Football Conference&amp;quot;&lt;/span&gt;;
            dataTransaction.Add(afc);

            &lt;span class="rem"&gt;// Divisions&lt;/span&gt;
            Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; divisions = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;,List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;();
            divisions.Add(&lt;span class="str"&gt;&amp;quot;AFC North&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;AFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Baltimore Ravens&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Cincinnati Bengals&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Cleveland Browns&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Pittsburgh Steelers&amp;quot;&lt;/span&gt;);
            divisions.Add(&lt;span class="str"&gt;&amp;quot;NFC North&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;NFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Chicago Bears&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Detroit Lions&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Green Bay Packers&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC North&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Minnesota Vikings&amp;quot;&lt;/span&gt;);
            
            divisions.Add(&lt;span class="str"&gt;&amp;quot;AFC South&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;AFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Houston Texans&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Indianapolis Colts&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Jacksonville Jaguars&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Tennessee Titans&amp;quot;&lt;/span&gt;);
            divisions.Add(&lt;span class="str"&gt;&amp;quot;NFC South&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;NFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Atlanta Falcons&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Carolina Panthers&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;New Orleans Saints&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC South&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Tampa Bay Buccaneers&amp;quot;&lt;/span&gt;);

            divisions.Add(&lt;span class="str"&gt;&amp;quot;AFC East&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;AFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Buffalo Bills&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Miami Dolphins&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;New England Patriots&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;New York Jets&amp;quot;&lt;/span&gt;);
            divisions.Add(&lt;span class="str"&gt;&amp;quot;NFC East&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;NFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Dallas Cowboys&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;New York Giants&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Philadelphia Eagles&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC East&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Washington Redskins&amp;quot;&lt;/span&gt;);

            divisions.Add(&lt;span class="str"&gt;&amp;quot;AFC West&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;AFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Denver Broncos&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Kansas City Chiefs&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Oakland Raiders&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;AFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;San Diego Chargers&amp;quot;&lt;/span&gt;);
            divisions.Add(&lt;span class="str"&gt;&amp;quot;NFC West&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;());
            divisions[&lt;span class="str"&gt;&amp;quot;NFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Arizona Cardinals&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;San Francisco 49ers&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;Seattle Seahawks&amp;quot;&lt;/span&gt;);
            divisions[&lt;span class="str"&gt;&amp;quot;NFC West&amp;quot;&lt;/span&gt;].Add(&lt;span class="str"&gt;&amp;quot;St. Louis Rams&amp;quot;&lt;/span&gt;);

            Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; teamToCoach = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();
            teamToCoach.Add(&lt;span class="str"&gt;&amp;quot;Chicago Bears&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Lovie Smith&amp;quot;&lt;/span&gt;);

            ManagementPackClass divisionClass = managementPack.GetClass(&lt;span class="str"&gt;&amp;quot;NFL.Division&amp;quot;&lt;/span&gt;);
            ManagementPackClass nfcTeamClass = managementPack.GetClass(&lt;span class="str"&gt;&amp;quot;NFC.Team&amp;quot;&lt;/span&gt;);
            ManagementPackClass afcTeamClass = managementPack.GetClass(&lt;span class="str"&gt;&amp;quot;AFC.Team&amp;quot;&lt;/span&gt;);
            ManagementPackClass coachClass = managementPack.GetClass(&lt;span class="str"&gt;&amp;quot;NFL.Coach&amp;quot;&lt;/span&gt;);

            ManagementPackRelationship divisionContainsTeamClass = managementPack.GetRelationship(&lt;span class="str"&gt;&amp;quot;NFL.DivisionContainsTeam&amp;quot;&lt;/span&gt;);
            ManagementPackRelationship coachCoachesTeamClass = managementPack.GetRelationship(&lt;span class="str"&gt;&amp;quot;NFL.CoachCoachesTeam&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; divisionName &lt;span class="kwrd"&gt;in&lt;/span&gt; divisions.Keys)
            {
                CreatableEnterpriseManagementObject division = &lt;span class="kwrd"&gt;new&lt;/span&gt; CreatableEnterpriseManagementObject(managementGroup, divisionClass);

                &lt;span class="kwrd"&gt;string&lt;/span&gt; conferenceName;
                ManagementPackClass teamClass;

                &lt;span class="kwrd"&gt;if&lt;/span&gt; (divisionName.Contains(&lt;span class="str"&gt;&amp;quot;AFC&amp;quot;&lt;/span&gt;) == &lt;span class="kwrd"&gt;true&lt;/span&gt;)
                {
                    conferenceName = &lt;span class="str"&gt;&amp;quot;AFC&amp;quot;&lt;/span&gt;;
                    teamClass = afcTeamClass;
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    conferenceName = &lt;span class="str"&gt;&amp;quot;NFC&amp;quot;&lt;/span&gt;;
                    teamClass = nfcTeamClass;
                }

                &lt;span class="rem"&gt;// Need to make sure to set key values of the host&lt;/span&gt;
                division[conference, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value = conferenceName;
                division[divisionClass, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value = divisionName;
                division[systemEntity, &lt;span class="str"&gt;&amp;quot;DisplayName&amp;quot;&lt;/span&gt;].Value = divisionName;
                dataTransaction.Add(division);
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; teamName &lt;span class="kwrd"&gt;in&lt;/span&gt; divisions[divisionName])
                {
                    CreatableEnterpriseManagementObject team = &lt;span class="kwrd"&gt;new&lt;/span&gt; CreatableEnterpriseManagementObject(managementGroup, teamClass);
                    team[teamClass, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value = teamName;
                    team[systemEntity, &lt;span class="str"&gt;&amp;quot;DisplayName&amp;quot;&lt;/span&gt;].Value = teamName;
                    dataTransaction.Add(team);

                    CreatableEnterpriseManagementRelationshipObject divisionContainsTeam = &lt;br /&gt;                               &lt;span class="kwrd"&gt;new&lt;/span&gt; CreatableEnterpriseManagementRelationshipObject(managementGroup, divisionContainsTeamClass);
                    divisionContainsTeam.SetSource(division);
                    divisionContainsTeam.SetTarget(team);
                    dataTransaction.Add(divisionContainsTeam);

                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (teamToCoach.ContainsKey(teamName) == &lt;span class="kwrd"&gt;true&lt;/span&gt;)
                    {
                        CreatableEnterpriseManagementObject coach = &lt;span class="kwrd"&gt;new&lt;/span&gt; CreatableEnterpriseManagementObject(managementGroup, coachClass);
                        coach[coachClass, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value = teamToCoach[teamName];
                        coach[systemEntity, &lt;span class="str"&gt;&amp;quot;DisplayName&amp;quot;&lt;/span&gt;].Value = teamToCoach[teamName];
                        dataTransaction.Add(coach);

                        CreatableEnterpriseManagementRelationshipObject coachCoachesTeam = &lt;br /&gt;                                      &lt;span class="kwrd"&gt;new&lt;/span&gt; CreatableEnterpriseManagementRelationshipObject(managementGroup, coachCoachesTeamClass);
                        coachCoachesTeam.SetSource(coach);
                        coachCoachesTeam.SetTarget(team);
                        dataTransaction.Add(coachCoachesTeam);
                    }
                }
            }

            &lt;span class="rem"&gt;// Use Overwrite instead of Commit here because I want to bypass optimistic concurrency checks which will not allow the &lt;/span&gt;
            &lt;span class="rem"&gt;// insertion of an existing instances and I want this method to be re-runnable&lt;/span&gt;
            dataTransaction.Overwrite(managementGroup);&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9396144" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/jakuboleksy/attachment/9396144.ashx" length="3232" type="text/xml" /></item><item><title>Getting Started with Type Projections</title><link>http://blogs.msdn.com/jakuboleksy/archive/2009/01/20/getting-started-with-type-projections.aspx</link><pubDate>Tue, 20 Jan 2009 21:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9349741</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9349741.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9349741</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9349741</wfw:comment><description>&lt;P&gt;A very powerful new concept in the SDK is the notion of Type Projections. I always describe type projections as a view over our type system, much like a SQL view over tables, with the added capability that our type projections are hierarchal. What projections allow you to do is query over and retrieve collections of objects related somehow in our model in one go. In this post I want to provide a very simply example of how to define and retrieve a type projection, and in future posts I will dive much deeper into working with them.&lt;/P&gt;
&lt;P&gt;For this post, I've attached a management pack (NFL.xml) that defines the classes and type projection used in the sample code. Also, I have the code I used to populate my objects in the &lt;STRONG&gt;Reference Code&lt;/STRONG&gt; section below.&lt;/P&gt;
&lt;P&gt;In the management pack you will notice two classes defined, &lt;STRONG&gt;NFL.Conference&lt;/STRONG&gt; and &lt;STRONG&gt;NFL.Division&lt;/STRONG&gt;, and a hosting relationship type, &lt;STRONG&gt;NFL.ConferenceHostsDivision&lt;/STRONG&gt;, between them. My scenario is that I want to display all the conferences and divisions in the UI, so I define a type projection that puts the two classes together:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;TypeProjection&lt;/SPAN&gt; &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Conference.All"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Accessibility&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="Public"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Type&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="NFL.Conference"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
     &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;Component&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Alias&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="Division"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;Path&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="$Target/Path[Relationship='NFL.ConferenceHostsDivision']$"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;TypeProjection&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The first thing you should notice in the above definition is the Type property on the root element; this defines the type of instance that should exist at the root or "seed" of the projection. Next, you'll notice the projection has one component, &lt;STRONG&gt;Division&lt;/STRONG&gt;, that relates to the root. The Path attribute is what defines how to find the desired component, relative to the seed. I will describe the path notation in more depth in future posts, but here Target refers to the seed element of the projection (an instance of &lt;STRONG&gt;NFL.Conference&lt;/STRONG&gt;), followed by a Path construct that tells the system to follow the &lt;STRONG&gt;NFL.ConferenceHostsDivision&lt;/STRONG&gt; relationship type.&amp;nbsp; This will result in a structure that looks like this:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;* NFL.Conference&lt;/STRONG&gt; &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;* NFL.Division&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Now, in order to work with this, the SDK has introduced a new object type, EnterpriseManagementObjectProjection, along with an interface, IComposableProjection, to allow for retrieval of and then navigation of the returned structure. The following code shows a basic example of retrieving and iterating through the objects:&lt;/P&gt;&lt;PRE class=csharpcode&gt;            &lt;SPAN class=rem&gt;// Connect to the management group&lt;/SPAN&gt;
            EnterpriseManagementGroup managementGroup =
                &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EnterpriseManagementGroup(&lt;SPAN class=str&gt;"localhost"&lt;/SPAN&gt;);

            &lt;SPAN class=rem&gt;// Get the management pack&lt;/SPAN&gt;
            ManagementPack nflManagementPack = 
                managementGroup.ManagementPacks.GetManagementPack(&lt;SPAN class=str&gt;"NFL"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Version(&lt;SPAN class=str&gt;"1.0.0.0"&lt;/SPAN&gt;));

            &lt;SPAN class=rem&gt;// Get the type projection&lt;/SPAN&gt;
            ManagementPackTypeProjection nflProjection = 
                nflManagementPack.GetTypeProjection(&lt;SPAN class=str&gt;"NFL.Conference.All"&lt;/SPAN&gt;);

            &lt;SPAN class=rem&gt;// Get the relationship type&lt;/SPAN&gt;
            ManagementPackRelationship nflConferenceContainsDivision = 
                nflManagementPack.GetRelationship(&lt;SPAN class=str&gt;"NFL.ConferenceHostsDivision"&lt;/SPAN&gt;);

            IObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt; objectProjections =
                managementGroup.Instances.GetObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt;(
                    &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ObjectProjectionCriteria(nflProjection), ObjectQueryOptions.Default);

            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (EnterpriseManagementObjectProjection projection &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; objectProjections)
            {
                Console.WriteLine(&lt;SPAN class=str&gt;"Conference {0}"&lt;/SPAN&gt;, projection.Object.DisplayName);
                &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (IComposableProjection division &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; projection[nflConferenceContainsDivision.Target])
                {
                    Console.WriteLine(&lt;SPAN class=str&gt;"Division {0}"&lt;/SPAN&gt;, division.Object.DisplayName);
                }
            }&lt;/PRE&gt;
&lt;P&gt;The sample first connects to the server and retrieves the type projection definition which is necessary for interacting with the SDK and the relationship type definition which is necessary for navigating the resulting instance. Next, we get an IObjectProjectionReader&amp;lt;EnterpriseManagementObject&amp;gt; that will contain all instances of our type projection. Finally, the example shows how to iterate through the object and get data. &lt;/P&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;&lt;STRONG&gt;Reference Code&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE class=csharpcode&gt;            &lt;SPAN class=rem&gt;// Connect to the management group&lt;/SPAN&gt;
            EnterpriseManagementGroup managementGroup =
                &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EnterpriseManagementGroup(&lt;SPAN class=str&gt;"localhost"&lt;/SPAN&gt;);

            &lt;SPAN class=rem&gt;// Import the management pack&lt;/SPAN&gt;
            ManagementPack managementPack = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ManagementPack(&lt;SPAN class=str&gt;"NFL.xml"&lt;/SPAN&gt;);
            managementGroup.ManagementPacks.ImportManagementPack(managementPack);
            managementPack = managementGroup.ManagementPacks.GetManagementPack(managementPack.Id);

            &lt;SPAN class=rem&gt;// Populate Data&lt;/SPAN&gt;
            IncrementalDiscoveryData dataTransaction = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; IncrementalDiscoveryData();

            &lt;SPAN class=rem&gt;// Get System.Entity class&lt;/SPAN&gt;
            ManagementPackClass systemEntity = managementGroup.EntityTypes.GetClass(SystemClass.Entity);

            &lt;SPAN class=rem&gt;// Conferences&lt;/SPAN&gt;
            ManagementPackClass conference = managementPack.GetClass(&lt;SPAN class=str&gt;"NFL.Conference"&lt;/SPAN&gt;);
            CreatableEnterpriseManagementObject nfc = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; CreatableEnterpriseManagementObject(managementGroup, conference);
            nfc[conference, &lt;SPAN class=str&gt;"Name"&lt;/SPAN&gt;].Value = &lt;SPAN class=str&gt;"NFC"&lt;/SPAN&gt;;
            nfc[systemEntity, &lt;SPAN class=str&gt;"DisplayName"&lt;/SPAN&gt;].Value = &lt;SPAN class=str&gt;"National Football Conference"&lt;/SPAN&gt;;
            dataTransaction.Add(nfc);

            CreatableEnterpriseManagementObject afc = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; CreatableEnterpriseManagementObject(managementGroup, conference);
            afc[conference, &lt;SPAN class=str&gt;"Name"&lt;/SPAN&gt;].Value = &lt;SPAN class=str&gt;"AFC"&lt;/SPAN&gt;;
            afc[systemEntity, &lt;SPAN class=str&gt;"DisplayName"&lt;/SPAN&gt;].Value = &lt;SPAN class=str&gt;"American Football Conference"&lt;/SPAN&gt;;
            dataTransaction.Add(afc);

            &lt;SPAN class=rem&gt;// Divisions&lt;/SPAN&gt;
            ManagementPackClass division = managementPack.GetClass(&lt;SPAN class=str&gt;"NFL.Division"&lt;/SPAN&gt;);
            &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;[] nfcDivisionNames = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;[] {
                &lt;SPAN class=str&gt;"NFC East"&lt;/SPAN&gt;,
                &lt;SPAN class=str&gt;"NFC North"&lt;/SPAN&gt;,
                &lt;SPAN class=str&gt;"NFC South"&lt;/SPAN&gt;,
                &lt;SPAN class=str&gt;"NFC West"&lt;/SPAN&gt;
            };
            
            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; nfcDivisionName &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; nfcDivisionNames)
            {
                CreatableEnterpriseManagementObject nfcDivision = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; CreatableEnterpriseManagementObject(managementGroup, division);
                
                &lt;SPAN class=rem&gt;// Need to make sure to set key values of the host&lt;/SPAN&gt;
                nfcDivision[conference, &lt;SPAN class=str&gt;"Name"&lt;/SPAN&gt;].Value = &lt;SPAN class=str&gt;"NFC"&lt;/SPAN&gt;;
                
                nfcDivision[division, &lt;SPAN class=str&gt;"Name"&lt;/SPAN&gt;].Value = nfcDivisionName;
                nfcDivision[systemEntity, &lt;SPAN class=str&gt;"DisplayName"&lt;/SPAN&gt;].Value = nfcDivisionName;
                dataTransaction.Add(nfcDivision);
            }

            &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;[] afcDivisionNames = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;[] {
                &lt;SPAN class=str&gt;"AFC East"&lt;/SPAN&gt;,
                &lt;SPAN class=str&gt;"AFC North"&lt;/SPAN&gt;,
                &lt;SPAN class=str&gt;"AFC South"&lt;/SPAN&gt;,
                &lt;SPAN class=str&gt;"AFC West"&lt;/SPAN&gt;
            };

            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; afcDivisionName &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; afcDivisionNames)
            {
                CreatableEnterpriseManagementObject afcDivision = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; CreatableEnterpriseManagementObject(managementGroup, division);

                &lt;SPAN class=rem&gt;// Need to make sure to set key values of the host&lt;/SPAN&gt;
                afcDivision[conference, &lt;SPAN class=str&gt;"Name"&lt;/SPAN&gt;].Value = &lt;SPAN class=str&gt;"AFC"&lt;/SPAN&gt;;

                afcDivision[division, &lt;SPAN class=str&gt;"Name"&lt;/SPAN&gt;].Value = afcDivisionName;
                afcDivision[systemEntity, &lt;SPAN class=str&gt;"DisplayName"&lt;/SPAN&gt;].Value = afcDivisionName;
                dataTransaction.Add(afcDivision);
            }

            &lt;SPAN class=rem&gt;// Use Overwrite instead of Commit here because I want to bypass optimistic concurrency checks which will not allow the &lt;/SPAN&gt;
            &lt;SPAN class=rem&gt;// insertion of an existing instances and I want this method to be re-runnable&lt;/SPAN&gt;
            dataTransaction.Overwrite(managementGroup);&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9349741" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/jakuboleksy/attachment/9349741.ashx" length="1636" type="text/xml" /></item><item><title>Improvements in SDK from Operations Manager 2007</title><link>http://blogs.msdn.com/jakuboleksy/archive/2008/12/22/improvements-in-sdk-from-operations-manager-2007.aspx</link><pubDate>Tue, 23 Dec 2008 01:48:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9248604</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9248604.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9248604</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9248604</wfw:comment><description>&lt;p&gt;I wanted to provide a high level overview of feature additions to the SDK since Operations Manager 2007 shipped. The items are in no particular order and will be discussed in more depth in subsequent posts. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Default Values for Properties&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;Types can define default values on properties. The default values need to be literals and are implemented using the default value column construct in SQL. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Required Properties&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;Types can now defined non-key required properties. Values for these properties will always be required during insertion unless the property has a default value, in which case that value will be used. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Auto-Increment Properties&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;Integer and string properties can be defined as auto-increment in a management pack. When instances of types that contain auto-increment properties are created in the SDK client, the client retrieves the next available value from the database and removes it from future use (whether or not the instance is committed). This value is then embedded in the property using a standard .Net format string with {0} replaced by the value from the database. As an example, this can be used to create unique, readable ticket numbers: &amp;#8220;SR_{0}&amp;#8221;. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Binary Properties&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;Binary properties have been added and are written and returned as streams. The stream is retrieved on demand and will not be brought back as part of normal instance retrieval. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Enumeration Properties&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Management packs can define enumerations that can be used as property values in the instance space. These enumerations are hierarchal and extensible via other management packs.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Categories in Management Packs&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Categories allow the association of an enumeration (as defined above) and a management pack element. An element can have an unlimited number of associated enumerations that act to categorize the element for various uses.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Type Extensions &lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;Type extensions are an MP schema change to allow a derived type to be defined as an extension of its base type. The design is such that a user can add a property to a type, for all instances of that type. Thus, when someone imports a type extension, the system adds this type to all instances of the base type and all new instances will automatically be an instance of the type extension class, regardless of the data the discovery packet that discovered them contains. Type extensions can be explicitly added or updated on an instance, but cannot be removed without removing the entire instance. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Relationship Endpoints&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;Relationships now have sub-elements that represent the source and target endpoints. These endpoints can define cardinality value of 0, 1 and MaxInt. If max and min cardinality are both 1, it is enforced by the infrastructure, otherwise it is used as a hint to the UI and other consumers. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Instance History&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;The CMDB stores property and relationship changes for instances. They can be retrieved per instance from the SDK and are used by other components internally that rely on instance space changes.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Instance Change Subscriptions&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Similar to the alert change subscriptions in OM, we now have an instance space change subscription data source that allows you to trigger other actions because on an instance space change. We use this to trigger WWF workflows. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Projections&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;A new concept in the type space, type projections allow you to define a hierarchal view over the type space that gets materialized on retrieval by the SDK client. This allows retrieval of logical instances that are composed of many instances and the relationships that join them together. The mechanism is used as the backing instance space definition for all forms and views in Service Manager; that is a view or form is bound to a particular projection. &lt;/p&gt;  &lt;p&gt;SDK also have a lot of functionality built in to support this concept, including advanced query support over these definitions. For instance, you can define a projection that is an incident with its assigned to user and then query for all instances of this projection where to assigned to user is some particular user. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Object Templates&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Object templates are essentially saved instances and projections defined in a management pack that can be used to create new instances or be applied to existing instances and set their values to those found in the template. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Type indexes&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You can now define indexes on types in a management pack to help improve performance. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Criteria Improvements&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Criteria has changed (we still support the old format as well) to be xml-based to remove ambiguity problems we had with the old model and to consolidate it with group calculation and subscription criteria. We&amp;#8217;ve also enhanced criteria to support projection queries, containment queries and added an IN clause predicate. The new features are only available with the new xml format.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Full-Text Queries&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Full-Text is supported for string and binary properties, with significant limitations in how the full-text query syntax can be leveraged within other criteria elements. Currently this is only being used for knowledge search within some limited scenarios. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Partial Instances&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Users of the SDK can now specify which properties they want to get back when they retrieve instances. This functionality applies to all mechanisms of retrieving instances and is recommended to help with performance issues when dealing with large data sets.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Paging and Sorting&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The SDK supports retrieving instances in a paged mode that returns some buffer worth of data on each remote call. This functionality should be combined with sorting that will allow for UI design that yields better performance. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Abstract Query Support&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Abstract types are now supported within type-based queries, both for types and projections. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Security Enhancements&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We&amp;#8217;ve expanded the security model to support property level write granularity, group + type scoping on read and implied permissions based on the instance itself (i.e. the owner of an incident as some set of implied permissions on it). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Resource Support in Management Packs&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Management packs can now have embedded resources (the file is msi-based) that separate large resources (reports, form binaries, etc) from the xml manifest of the management pack. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;XPath Navigable Instance Space&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;With the introduction of projections it became important to have a friendlier way to traverse a large hierarchal instance on the client. To server that need projection instances and instances are both XPathNavigable. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Optimistic Concurrency on Instances&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We support full-optimistic concurrency support, per instance. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Unification of CustomMonitoringObject and MonitoringObject&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We&amp;#8217;ve merged the two objects for a more consistent experience when working with the instance space in the SDK.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9248604" width="1" height="1"&gt;</description></item><item><title>Getting Started with the Service Manager SDK</title><link>http://blogs.msdn.com/jakuboleksy/archive/2008/12/03/getting-started-with-the-service-manager-sdk.aspx</link><pubDate>Wed, 03 Dec 2008 20:08:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9170841</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9170841.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9170841</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9170841</wfw:comment><description>&lt;p&gt;The Service Manager public API is partitioned into several assemblies all of which can by found either in the GAC after install or in the Program Files folder in &amp;quot;SDK Binaries&amp;quot;. The primary assembly is Microsoft.EnterpriseManagement.Core (Core) which replaces Microsoft.EnterpriseManagement.Common from Operations Manager 2007. Core also contains a lot of the functionality from the Microsoft.EnterpriseManagement.OperationsManager (OM) assembly that shipped with Operations Manager 2007. The OM assembly still exists, but contains only Operations Manager specific functionality. Service Manager also has a couple other assemblies with Service Manager and Data Warehouse functionality. The following table describes the relationships between Service Manager and Operations Manager assemblies.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="962" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="366"&gt;&lt;strong&gt;&lt;em&gt;Service Manager&lt;/em&gt;&lt;/strong&gt; &lt;/td&gt;        &lt;td valign="top" width="594"&gt;&lt;strong&gt;&lt;em&gt;Operations Manager 2007&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="364"&gt;Microsoft.EnterpriseManagement.Core&lt;/td&gt;        &lt;td valign="top" width="594"&gt;Microsoft.EnterpriseManagement.Common and Microsoft.EnterpriseManagement.OperationsManager&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="363"&gt;Microsoft.EnterpriseManagement.ServiceManager (SM)&lt;/td&gt;        &lt;td valign="top" width="594"&gt;None&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="363"&gt;Microsoft.EnterpriseManagement.OperationsManager&lt;/td&gt;        &lt;td valign="top" width="594"&gt;Microsoft.EnterpriseManagement.OperationsManager&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="363"&gt;Microsoft.EnterpriseManagement.DataWarehouse (DW)&lt;/td&gt;        &lt;td valign="top" width="594"&gt;None&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The refractoring of the Operations Manager assemblies was done to enable a better story for sharing functionality across the products. Core is delivered by the Service Manager team and provides the fundamental services that System Center products built on top of the OM CMDB share. Core contains the majority of the instance space functionality, all of the management pack infrastructure and other common features across the products. SM contains functionality on the Service Manager product needs while OM is for Operations Manager only. In Beta 1 Service Manager still uses the OM assembly as we haven't completely refractored everything as necessary. The DW assembly contains new data warehouse specific functionality; this is functionality specific to the new Service Manager based data warehouse and not the old Operations Manager data warehouse functionality, which can still be found in the OM assembly. &lt;/p&gt;  &lt;p&gt;In order to get started, you need to link at the very least against the Core assembly. Once you do that, the following code will establish a connection to the locally installed SDK service:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.EnterpriseManagement;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Jakub_WorkSamples
{
    &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Program
    {
        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Connect()
        {
            &lt;span class="rem"&gt;// Connect to the local management group&lt;/span&gt;
            EnterpriseManagementGroup localManagementGroup = &lt;span class="kwrd"&gt;new&lt;/span&gt; EnterpriseManagementGroup(&lt;span class="str"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;);
        }
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;You'll notice this part is almost identical to the Operations Manager. Once the connection is established, you can begin playing around with the various services provided by EnterpriseManagementGroup. Previously most functionality was actually directly on EnterpriseManagementGroup and while it is all still there (on ManagementGroup, derived from EnterpriseManagementGroup) , it is marked as obsolete as we are using a new paradigm for providing access to various features of the API. The new mechanism for accessing various parts of the API is centered around services (namely interfaces) exposed via properties on the EnterpriseManagementGroup object. You'll notice, for example, a property called Instances. This provides access to a variety of methods that deal with instance space access. A quick sample follows:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.EnterpriseManagement;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.EnterpriseManagement.Common;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Jakub_WorkSamples
{
    &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Program
    {
        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetInstance()
        {
            &lt;span class="rem"&gt;// Connect to the local management group&lt;/span&gt;
            EnterpriseManagementGroup localManagementGroup = &lt;span class="kwrd"&gt;new&lt;/span&gt; EnterpriseManagementGroup(&lt;span class="str"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;);

            &lt;span class="rem"&gt;// Get an instance by Id (need to replace with valid Id of an instance)&lt;/span&gt;
            EnterpriseManagementObject instance = &lt;br /&gt;                  localManagementGroup.Instances.GetObject&amp;lt;EnterpriseManagementObject&amp;gt;(Guid.NewGuid(), ObjectQueryOptions.Default);
        }
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Over time I'll be talking about the various interfaces and the specific functionality they provide and be talking much more about the Instances interface which introduces significant new functionality from the equivalent OM objects (MonitoringObject). &lt;/p&gt;

&lt;p&gt;This model of partitioning is used in all the assemblies and allows us to better group and share functionality across products. We're definitely still open to feedback on how to better partition our services; our goal is to group common functionality together such that most tasks would be done by using one or two services.&lt;/p&gt;

&lt;p&gt;Also, a couple things to note. First, this is Beta 1 and there will be changes moving forward. The Instances API in particular will undergo a significant facelift as we are added buffered read support for instances. We are also cleaning up the interfaces and trying to remove unnecessary overloads as much as possible.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9170841" width="1" height="1"&gt;</description></item><item><title>Service Manager Beta Released</title><link>http://blogs.msdn.com/jakuboleksy/archive/2008/11/24/service-manager-beta-released.aspx</link><pubDate>Tue, 25 Nov 2008 00:59:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9139132</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9139132.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9139132</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9139132</wfw:comment><description>&lt;p&gt;You can find more details &lt;a href="http://blogs.technet.com/servicemanager/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Also, community forums are setup for discussion and can be found &lt;a href="http://forums.microsoft.com/TechNet/default.aspx?ForumGroupID=575&amp;amp;SiteID=17 "&gt;here&lt;/a&gt;. These are the preferred medium for questions with the beta.&lt;/p&gt;  &lt;p&gt;I'm out for Thanksgiving this week, but plan to get started next week with a high-level post on fundamental changes in the SDK architecture to better accommodate Service and Operations Manager with a single, shared API. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9139132" width="1" height="1"&gt;</description></item><item><title>New Look, Evolving Content</title><link>http://blogs.msdn.com/jakuboleksy/archive/2008/10/31/new-look-evolving-content.aspx</link><pubDate>Fri, 31 Oct 2008 18:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9026785</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/9026785.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=9026785</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=9026785</wfw:comment><description>&lt;p&gt;Well, it has been a while since I had any posts with new content (and it will actually be just a bit longer), but I wanted to write a quick post on what has been going on with SDK development for Operations Manager and talk a bit about Service Manager.&lt;/p&gt;  &lt;p&gt;First off, Operations Manager is going well and tracking toward R2. I've been been involved in that development, but there is not a lot of new content that went into the SDK for that release; mostly important bug fixes were put in to address customer issues and other issues that were found. There were a few new features that went in to help with performance (such as a lightweight alert and event objects to help with views), but development on the SDK has been slow going on that front. &lt;/p&gt;  &lt;p&gt;After SP1 (although we've been keeping changes in sync since then) of Operations Manager was ready, we took the SDK code and have been evolving it to meet the needs of Service Manager. Service Manager has much deeper and more complicated requirements of the SDK and it makes sense for that product to push and own the charter of the SDK. The plan is to have the next major release of Operations Manager be built on top of the new SDK so that Service Manager and Operations Manager truly share a large part of the infrastructure. This will help enable a lot of &amp;quot;better together&amp;quot; scenarios for both products.&lt;/p&gt;  &lt;p&gt;We've been busy putting a ton of new features into the SDK and enabling all sorts of new scenarios to be possible over the infrastructure and we're tracking well to our Beta 1 that will be released shortly. For those that are familiar with Service Manager, formerly Service Desk, this is the first public release after the previously announced reset. &lt;/p&gt;  &lt;p&gt;I plan to evolve this blog into discussions around this new SDK, its new features, differences with the Operations Manager 2007 and general help for the Service Manager product. I will continue to field your questions either through email or through comments here on Operations Manager, but as is already self-evident if you look at my recent blog posts, I will not be writing new posts on SCOM 2007 SDK. When the next major release of SCOM has its first public milestone, all of the content here will be pertinent to that as well. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9026785" width="1" height="1"&gt;</description></item><item><title>Good Article on Management Pack Authoring</title><link>http://blogs.msdn.com/jakuboleksy/archive/2008/07/01/good-article-on-management-pack-authoring.aspx</link><pubDate>Tue, 01 Jul 2008 20:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8677944</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/8677944.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=8677944</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=8677944</wfw:comment><description>&lt;P&gt;A co-worker of mine recently pointed this out to me, so I thought I would share here.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;A href="http://www.developer.com/design/article.php/3740486"&gt;&lt;FONT face=Calibri size=3&gt;http://www.developer.com/design/article.php/3740486&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8677944" width="1" height="1"&gt;</description></item><item><title>System Center Virtual User Group</title><link>http://blogs.msdn.com/jakuboleksy/archive/2008/06/30/system-center-virtual-user-group.aspx</link><pubDate>Mon, 30 Jun 2008 20:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8672051</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/8672051.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=8672051</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=8672051</wfw:comment><description>&lt;P&gt;The System Center Virtual User Group recently had their first meeting where they presented on several topics about Operations Manager 2007. They recorded the live meeting and posted the content online. The topics were&amp;nbsp; &lt;A href="http://www.it-jedi.net/downloads/scug/meeting1/anders.wmv" target=_blank&gt;Cross-platform monitoring in Operations Manager 2007 SP2&lt;/A&gt;, &lt;A href="http://www.it-jedi.net/downloads/scug/meeting1/marco.wmv" target=_blank&gt;Powershell in Operations Manager 2007&lt;/A&gt;, and &lt;A href="http://www.it-jedi.net/downloads/scug/meeting1/ryan.wmv" target=_blank&gt;Audit Collection Services (ACS) Planning, Configuration and Tuning Tips.&lt;/A&gt; You can find all the videos linked &lt;A class="" title=here href="http://www.systemcenterusergroup.com/blogs/administrator/default.aspx" target=_blank mce_href="http://www.systemcenterusergroup.com/blogs/administrator/default.aspx"&gt;here&lt;/A&gt; as well. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8672051" width="1" height="1"&gt;</description></item><item><title>System Center Service Manager</title><link>http://blogs.msdn.com/jakuboleksy/archive/2008/02/12/system-center-service-manager.aspx</link><pubDate>Tue, 12 Feb 2008 19:32:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7646609</guid><dc:creator>JakubOleksy</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jakuboleksy/comments/7646609.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jakuboleksy/commentrss.aspx?PostID=7646609</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jakuboleksy/rsscomments.aspx?PostID=7646609</wfw:comment><description>&lt;p&gt;Well, I have been pretty quiet lately with posts and I can finally share why. Over the past few months I have been very busy working on System Center Service Manager and making the Operations Manager infrastructure work for that product as well. More information about the changes in that product can be found here:&lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.technet.com/systemcenter/" href="http://blogs.technet.com/systemcenter/"&gt;http://blogs.technet.com/systemcenter/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Given these changes, I am actually no longer on the Operations Manager team, but actually exclusively on the Service Manager core development team. What does that mean for Operations Manager and the SDK? The infrastructure I am working on builds on the existing SDK of Operations Manager API and makes it work seamlessly with Service Manager and Operations Manager. The infrastructure will be structured as a System Center programmatic infrastructure with a lot of functionality being common across products (currently Service Manager and Operations Manager), with product specific functionality built on top of it. &lt;/p&gt; &lt;p&gt;All this being said, the best way to use the API today is to make sure a proper level of abstraction is used in larger projects; this will minimize impact of any changes in the future. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7646609" width="1" height="1"&gt;</description></item></channel></rss>