Fabian Williams SharePoint Blog

Solving problems with SharePoint day and night

How To: Create Content Types with Site Columns in Code Visual Studio 2010 for SharePoint 2010

Synopsis: So why would you Ever Ever need to feel the pain of creating Content Types from scratch and associate Site Columns also in code with them? Well, the one glaring reason is that if you create site columns and content types out of Code, you loose the control of assigning the GUID which is in effect the id designator of the object.  If you cannot control that, then as you move through a proper SDLC with a DTP environment, you in essence loose control over the same ID’s [objects] being the same across all the environment.  The second reason is that you have a clean and automated way to deploy your solution to any environment, inherently you could package and sell this solution if you wanted to.

So how do you do it?

Sahil Malk (@sahilmalik)has a great book in Building Solution in SharePoint 2010 and he has a great chapter on this topic. I used that as my premise for creating a full fledge Content Type with Site Columns to boot. Doing this in Visual Studio 2010 on SharePoint 2010 and the entire process to deploy is so easy now, even a caveman can do it.

Like Bud Light — Here we go!

First we need to start a new SharePoint Empty Project and start to build your solution out.

clip_image001

Next, and very appropriately, we are doing this as a Sandbox Solution because EVERYTHING we are doing for this effort will be in the Database, nothing will be on the File System. This is where you as a developer can do all the damage you want without worrying about the Farm Admin calling you saying “…hey dude, you brought down the server..” will never happen, sure you can bring down the Site Collection but hey, thats on you buddy..

clip_image002

Once you have your Sandbox Solution set, lets had some “SharePoint Items” first will be a Content Type

clip_image003

As you see below, I am calling mine AdotobClient. The idea here is that for my company Adotob, LLC, I am creating a Content Type that inherits from the Item Content Type which will hold Client specific data. The important thing here is that as a Content Type, this can  be used all across the Enterprise in any Web by anyone.  Build it once, use it many.

clip_image004

Once named, now your project will look like this.

clip_image006

As I mentioned before and as you will see below, everything in SharePoint inherits from a base, in this example I am inheriting from the Item Content Type, the wizard asks me to choose and i selected my choice

clip_image007

clip_image008

Now we will do some clean up. When you add the Content Type, you also get an elements.xml file created for the definition of the Content Type, now realistically if this content type is to be of any use, it will need Site Columns, but for now, we will just rename the elements.xml to something more descriptive.

clip_image009

clip_image010

So, this Content Type will have a few site columns to express what it is about the client we want to capture, it will be of many data types, text, date/time, etc. lets go and add an Empty Element which will be the Site Columns and populate the Elements.xml with the fieldtypes.

clip_image011

Before we do lets spot check what our Project looks like now.

clip_image012

As for clean up, lets rename the Site Columns elements.xml to a more representative name…

clip_image013

Lets us now flesh out the Site Columns, as you see below i am capturing all the necessary information one would capture about a client. Name, address, contact info, social content, etc. Below I use the Make Guid tool in Visual Studio to create those Field ID’s, and i with all my cut and paste, i screwed up the last entry, that type was to be a Text but i left it as date time.. oops.

clip_image014

Once we do that, we now associate those site columns via the GUID [Field ID == Field Ref] in what was the elements.xml of the Content Type

clip_image015

Once you are done, go ahead and build and deploy your solution. Oh make sure that you have Sandbox Solution Service turned on in the Central Administration before you do that, it is not on by default. Below if you inspected your Site Settings at the top level you will find the new Content Type

Trust but Verify

 

clip_image016

Click inside the Content Type, and you will find the site columns we defined.

clip_image017

Once we have done that lets spin up a new Custom List. We will include this content type in there and create an entry

clip_image018

To do that we need to manage content types…

clip_image019

We select the one we created and move it over

clip_image020

I also disabled the Item default content type what was there before so the only one that is an option is the one we created.. see below

clip_image021

Now we will make an entry for a new client

clip_image022

clip_image023

And our result is..

clip_image024

Voilla! you have a Content Type with Site Columns that you can manage NOT ONLY across the enterprise, but between Development, Test and Production Environment.

As usual, your comments, critique and questions are welcomed.

July 3, 2010 Posted by | Content Types, SharePoint 2010, SharePoint 2010 RTM, SharePoint Development, Site Columns, Visual Studio 2010 | 8 Comments

How To: Use SharePoint 2010 WebParts with a GridView Control to get SQL Image Data type and other Values

Recently I was faced with a challenge

  • Render a LOB System Data in SharePoint. Datatypes include an Image (BLOB) , char and int
  • Provide a means to filter by Last Name

Initial Approach

So as all professionals we should ‘Strive For’ the solution that can be done Out-Of-Box before trying to code a solution.  That said, I came up with a few ideas

  1. Use Business Connectivity Services (BCS)[yeah my one an only true SharePoint Love] to get this information, why, because it is in a LOB system and its SQL, and… well you get the drift: failing that
  2. Use a Visual WebPart in Microsoft Visual Studio 2010 arsenal of weapons, why, because I can just have the gridview auto create the columnd and be on my way: failing that
  3. Use a gridview control as part of a WebPart in Visual Studio 2010.. this is what won otherwise there would be a 4,5,etc….

The Gotchas

Well with the BCS approach; using SharePoint Designer 2010, we are not able to get the Image data type to come accross, much less map to an office property (a nice to have)

clip_image001

clip_image001[5]

Screen clipping taken: 6/29/2010 6:09 PM

clip_image002[6]

Screen clipping taken: 6/29/2010 6:20 PM

Now that we have put that to bed. Lets try some of our coded approaches.

    One approach that we could take would be to do a visual webpart with a gridview control on the page with "Auto-Generate Field" turned on; yeah, that was my first instinct too. However that will not work

    clip_image001[7]

    What will happen here is that the fields will in fact auto-generate however the only fields that will come across will be textual fields and of course our SQL Data Type is of type "Image". So in the end if you use exactly what we saw in our Business Connectivity Services example with SharePoint Designer 2010 visualized in an External List.

    Not to be dissuaded; my next thought was NOT to abandon the gridview control but to add a ‘Template Field’ and include an ‘Image Control’ inside with a reference to a HTTP Web Event Handler… sure this has to work, because I will explicitly stream the bytes in the Handler.ashx file and call it in the ImageUrl Property of the control….

    clip_image002[8]

    Yeah that wont work either because by the time the page [a User Control page ".ascx"], it is too far gone…. But a Visual Web Part would have made it sooooo eassyyyyy. But alas we have to look for another way.

    So your results will look like this….

    clip_image003

     

    The Solution

    Interestingly enough, the solution lies in all of the above with the exception that we cannot use a "User Control Page", we have to use an ".aspx" page. We will still have to use a HTTP Web Event Handler because we need to deal with the fact that we are pulling an Image directly from a SQL Database as a BLOB. So here are the steps I took

    Steps:

    1. Create an Empty SharePoint 2010 Visual Studio Project
    2. Add your Mapped SharePoint Folders for the _Layouts Directory as we are creating an Application Page. If you plan to add images too especially for your Feature, then go ahead and map the Images Folder also

    clip_image004

    1. Next in the same manner add an Elements Section
    2. When you are done, right click on your Folder within your mapped folder [coincidentally it will be the same name as your Project] and ‘Add a new Item’ which will be an application page.

    clip_image005

    1. I call mine "DisplayEmployeesWithPic.aspx" and this will create your page and your code-behind .cs file

    clip_image006

    1. So as it is an Application Page in our Visual Studio Template, it ready to go with the ContentPlaceHolders; we will be targetting the PlaceHolder for "Main" and wire-up our GridView and I am using a Button to add a filter.

    clip_image007

    1. We code against that in our code behind page to set our Datasource [which because I am a lazy developer, we will use the LINQ to SQL Data Connection], perform our query, data-bind and apply filter. You will notice below that I moved away from "Integrated Security" to "Standard Security" in my SQL Connection string because I met into two (2) specific problems (a) ‘Double Hop Problem’ when I ran the code from my Virtual Workstation and (b) Unless I had the End User to the LOB System, they didn’t have access to the dataset. I could have used Kerberos to solve my Double Hop issue, but I still would have the data access to deal with and I use that database to showcase my Business Connectivity Services / Secure Store [Single Sign-On] demos also, and how could I reasonably say that I am doing single sign on when I have folks there all willy nilly in the DB.

    clip_image008

    Screen clipping taken: 6/30/2010 7:42 PM

    1. The next thing we have to do because we are going after a non character data type in the SQL Database and trying to display it on a Grid View control is we need an HTTP Web Handler (a .ashx) file. This little code here is what intercepts traffic and steams the image to the image control previously seen in Step 5

    clip_image009

    1. Next we will add a Feature and ensure that the files are copied into the "Items in the Feature" section. The Elements .xml should auto configure it self also. You will notice I set the Scope to Site not the Default "Web".

    clip_image010

    Below are the options now in Visual Studio 2010 Teamplates

    clip_image011

    1. You Debug or Build and Deploy your Solution to the Farm. Yes, Farm, this cannot be done as a Sandbox Solution because it is touching the file system.

Trust but Verify Section

So that you can see that I have nothing up my sleeves [if you have ever sit in one of my Confrences or Speaking engagements, you know I always say and do this part] I will show you the results as is, then I will walk you through adding a recoredset and see the live results in SharePoint

  1. This is what we expect to see based on what is in the LOB System Now

clip_image001[9]

With a Filter

clip_image002[10]

Screen clipping taken: 6/30/2010 7:57 PM

  1. Next and in the spirit of the World Cup where Spain WILL / MUST WIN!!! (I now digress), we will add David Villa and the guy I so love to pick on; and yeah maybe it’s a little haterism, cry baby Ronaldo. Lets go get some stats…

clip_image003[5]

Screen clipping taken: 6/30/2010 8:00 PM (curtosy of Fifa.com) so I don’t get sued…

clip_image004[5]

Screen clipping taken: 6/30/2010 8:04 PM

clip_image005[5]

FIFA.com – 2010 FIFA World Cup™ – CRISTIANO RONALDO

http://www.fifa.com/worldcup/players/player=201200/index.html

Screen clipping taken: 6/30/2010 8:07 PM

clip_image006[5]

The Proof is in the pudding

clip_image007[5]

Hope this helps everyone who comes across it, as usual, your comments, critiques, and questions are welcomed.

June 30, 2010 Posted by | Business Connectivity Services, SharePoint 2010, SharePoint 2010 RTM, SharePoint Designer 2010, SharePoint How-To, SQL Server, Strange Stuff, Visual Studio 2010 | 5 Comments

How To: So you have a GUID in your External List huh, Yes you can Update the List… if you set it up right

Synopsis:  I fielded a question on MSDN again and it peaked my interest because it had to do with of course BCS. The stated question was an issue when trying to update an External List when a GUID was present.  So I setup a new table, created a… well you will see it below.

image

 

Part 1: Set the Environment and Duplicate the Issue

clip_image001

Above: So I created the Table above and as you can see I used a GUID with (newid()) property set

clip_image002

Above: Added two people to the list and as you can see the GUID is present.

Part 2: Test it out

clip_image003

Above: Created an External List from the ECT, External List is called “GUID in People List” and what I did was also a “Create All Operation” however you will notice that you DO NOT SEE that the GUID Field is not present in the List View

clip_image004

Above:  I created a New Item and populated it with values. Notice here again that the GUID is not present and my Required or “NOT NULL” values from SQL is also denoted

clip_image005

Above: The New User is persisted

clip_image006

Above:  The External Content Type with CRUD capabilities

Part 3: Explaining why my example presumably worked “once” as  yours probably did too and not afterwards

clip_image007

Above: As you would expect the IDGUID field as a primary key / Identity field is protected.  So, it is set to Read Only in the Return Parameter Configuration Wizard.

clip_image008

Above: Just to show you, the second field i am putting in the Picker is NOT read only but it is a Required Field in the LOB

Part 4:  Why Subsequent try’s FAIL and how to make it work… yes Visual Studio

 

clip_image006[5]

Above:  So this is the entry that is made from the last example. BUT because the GUID is set to all Zeros as the question indicated in the Forum and it HAS TO BE a primary key, any subsequent addition in SharePoint will fail because of the duplicate entry.

clip_image001[5]

Above:  Here is our Test Case, let us add a new user called “User 95”

clip_image002[5]

Above:  And of course we error out because of the Primary Key Constraint in the LOB system

clip_image003[5]

Above:  So just to take this all the way to the end, lets do something that we SHOULD NOT DO. We will remove the Read-Only property of the Primary Key in SharePoint; in doing so you will find out exactly WHY it fails and how to fix it in the end. Notice it says that it needs the “PreUpdaterField” this field is in Visual Studio NOT SharePoint Designer.  So this is yet another answer that I give to people that constantly ask me “Hey Fabian, why do i need to use Visual Studio”

clip_image004[5]

Above: We try to put another record there..

clip_image005[5]

Above: Yes Same Error because the LOB system WILL NOT permit it to do so.

Part 5: How to Make it Work

See my BLOG on how to do CRUD ECT and External Lists using Visual Studio. See https://fabiangwilliams.wordpress.com/2009/12/03/creating-a-sharepoint-2010-external-content-type-with-crud-methods-using-linq-and-a-sql-lob-system/

I will try to do one specific for this example over the weekend time permitting.

April 17, 2010 Posted by | Business Connectivity Services, SharePoint 2010, SharePoint Designer 2010, SharePoint Development, SharePoint Error/Resolution, SharePoint How-To, SQL Server, Visual Studio 2010 | 3 Comments

My SharePoint Deck for my BCS Sessions now on SlideShare.net

February 28, 2010 Posted by | SharePoint 2010, SharePoint Designer 2010, SharePoint Development, SharePoint General, SharePoint How-To, SharePoint Saturdays, Visual Studio 2010 | , , , | Leave a comment

How To: Create a Farm Based and Sandbox Based Solution Web Part using LINQ to SharePoint via SPMetal Utility

Synopsis

In this Blog and in all the blogs i post, I try to re-use my work/efforts; for one, it ensures that the information is grounded, it certainly gives me practice, and more importantly, it demonstrates how SharePoint is modular, and how each part of the Wheel Compliments each other.  So.. </soapbox> over, lets begin… The idea here is to demonstrate how we can affect changes to SharePoint Lists and Libraries; for instance, we will use LINQ to SharePoint to talk to Lists in a Site, and use Sandbox Solutions to "work in that list in a protected area” based on the Rules of the Sandbox.  Now; the intrusive part is the how we gain access to the SharePoint List, in this example (Part 1) I am still doing a Sandbox Solution which means it is limited to the Site Collection, but I still have code that may be better protected in a “Full Trust Proxy” which will be (Part 2).

Get ready on how you can do:

  1. Create a Sand Box Solution with Visual Studio 2010 Beta 2 on SharePoint 2010 Beta
  2. Use LINQ to SharePoint via the SPMetal Utility to create and add a Class to our Solution to act as the Wrapper to our Content Database
  3. Create a Web Part to display information from SharePoint Lists
  4. Use some Code to do some actions on that List

Recognition of Effort to my friends in the SharePoint Community

So… I want to take time out to recognize some of my buddies in the SharePoint Community that helped with a really weird issue I was having trying to get even a “Hello World” textbox control working in my Sandbox Solution.  As it turned out and I do have the troubleshooting steps outlined below, my issue was related to having SharePoint 2010 on a Domain Controller, and the problem was solved [albeit after 12 hours of work and 4 – 6 hours troubleshooting] via a PowerShell Script found on Jie Li’s and Jeremy Thake’s site.  Using Twitter (yes I know, I tweet too much) I solicited the help of my co-worker Bart Tubalinal @bart_tubalinal and Jeremy Thake @jthake to see if they saw something glaring wrong in my code; they looked, they found nothing… then i hear the words I didn’t want to hear “… have you tried looking in the ULS log…, this may be your environment…” this would have not shocked me as much if I didn’t have to deliver at Virginia Beach SharePoint Saturday this coming Saturday (1/9/2009), and didnt want to risk doing an re-install my OS. In the end Paul Swider @pswider asked if i ran the script found on Jie Li’s site; as soon as i placed it in a file and ran it with PowerShell, BOOM! I was good to go!  Mark Miller @EUSP of End User SharePoint pointed out that he may emphasize the community involvement in a Keynote he is prepared to give, I encourage him to do so.

Let us Begin…

 

Part 1: This is Part 1
Part 2: Doing everything but using a Full-Trust Proxy for the most Intrusive Part of the job!

So the first thing we need to do is crack open our spiffy Visual Studio 2010 and Create a new SharePoint Empty Project

clip_image001

  1. Fire up Visual Studio
  2. Select SharePoint 2010
  3. Select Empty SharePoint Project (as you can see I named mine TouchPeopleinSharePoint)

clip_image002

Next you will be prompted to choose if this is a Sandboxed Solution or a Farm Solution, I selected “the Default” which is SandBoxed Solution… so what is Microsoft trying to tell us here folks?

clip_image003

Once you have done that, click Finish to close out the dialog box.  Next just to be sure, you can never be too careful; since I am building against a x64 bit system, I wanted to make sure that my Project Properties Build Targets were appropriately set.

clip_image004

Once I have completed that process, next I am going to add a new Web Part. NB, you are not permitted to do Visual Web Parts in SandBoxed Solution because that would mean that you would need to deploy it on the WFE; which under SandBoxed Solutions, we don’t want to, so… we wanna select a regular web part.

clip_image005

See below…

clip_image006

So once the Web Part is added, we have the following cs file created, clearly you can see we have methods that are over-ridden which we will employ in our solution.

clip_image007

Before we get there however, I need to do some prep work..

  • I need to Add my SPMetal Class
  • I need to make a reference to Microsoft.SharePoint.Linq

This Class that I am adding is created by SPMetal Utility and it basically provides me Entity Classes and a Context Object to manipulate SharePoint Lists via LINQ to SharePoint. I use this because all that plumbing is already done for me and hey, work smarter not harder…

clip_image008

clip_image009

clip_image010

NB. The Red squigglies are there in this CharlieSiteLists.cs file because I dont at this time have a Reference Set for Microsoft.SharePoint.Linq which i will do below…

clip_image011

So now for the real work… finally!

  1. So first I create a List Box object, I will add my result set to that collection (line 16)
  2. I make a reference to the CharlieSiteList.cs (SPMetal Utility Created File) Data Context Object so I can use it as a Wrapper to the Content Database (line 25)
  3. I iterate though a list and return the First Name and Last Name via the Add Method of the ListBox Object (line 26 – 33)

clip_image012

That is it! Easy huh… now we just Deploy our Solution…

clip_image013

Next I go to my site under “Site Pages” and create a Web Part Page…but before I do that, lets just make sure that our Sandboxed Solution is there in the Gallery. We find this by clicking on Site Settings and under Galleries, you will see “Solution”.. go ahead and click that bad bwoy..

clip_image014

All being well you should see your solution as I see mine…

clip_image015

Now, we edit that page we would have created to hold our Web Part or you can just put it in a page of your choosing. 

clip_image016

So, here is where the SharePoint community came alive for me last night.. and although SharePoint threw no Error in the Event Viewer, nor did the Actions yielded any “gotchas” that I did anything wrong, when I added the Web Part to a zone..

When I add the TouchPeopleNOLookupList Web Part to the Left Column Zone as indicated below it goes though the motion but ADDs Nothing but in the ShowMyProfile Web Part it works… that web part is a Farm Level Solution though… same code.. 

clip_image017

Below Same Code… in the Create ChildControls in a NON SandBoxed Solution

clip_image018

U can see in the Properties Window that this one is same code but not SandBox Solution… and it yields results as above…

clip_image019

So as part of my debugging I downloaded this ULS viewer from CodePlex at http://ulsviewer.codeplex.com/ and I saw that, Indeed, I have a few errors going..

image

Paul Swider pointed me to Jie Li’s site where i saw below,

image

I placed that script in a file and ran it with PowerShell and I got my Web Part to work as indicated below. 

image

We are in business folks…

image

Stay tuned for Part 2 where I will do this all with a Full Trust Proxy i.e. move the intrusive Class that actually touches the Content Database to the GAC and use a Proxy to call it.

 

Have fun! 

January 4, 2010 Posted by | SharePoint Administration, SharePoint Bug, SharePoint Development, SharePoint Error/Resolution, SharePoint How-To, Strange Stuff, Visual Studio 2010 | , , , | 3 Comments

Creating a SharePoint 2010 External Content Type with CRUD Methods using LINQ and a SQL LOB System

Synopsis:

First, this lab builds on an article I saw on MSDN which discussed how to create an External List using Business Data. I noticed that they showed methods for the code but showed no foundation or a Use Case, nor did it discuss the LOB System and how the class entity relationship is defined.

In this Lab/Demo we will show a SQL LOB system which holds Personnel data. Imagine if you will, a system such as SAP, PeopleSoft, Dynamics, etc.  Imagine also that this LOB system is the Source of Record for your organization for things such as Human Resource related data which may be consumed by Active Directory, Sales, Marketing, Finance(Payroll) etc.  How can we surface that data in a Read, Create, Update and Delete fashion maintaining fidelity and ease of use?  here is how…

UPDATE: – On 10/14/2012 I have added another blog post Series that will extend this post for SharePoint 2013 employing WCF, .Net Assembly and OData with SharePoint Apps see it HERE

 

First

  • Check out your Database and pay special to the Columns which will be your fields in your Class Definition, also document your data types.
  • Create a Visual Studio Project using the Business Data Connectivity Model Template
  • Connect to your Database
  • Model the Entity
  • Use LINQ to create the methods to LOB Systems
  • Create the External List
  • Test and Verify

clip_image001

Above: First we need to have our database ready. Above we can infer that we will be going against a server called “Tico”, a Database called “FabianPlayPen” and a Table called “Employee” please take time to notice the current data records currently in there. Once you are done, crack open your Visual Studio 2010 Beta 2.

clip_image002

Note: To work with the Beta 2 bits of SharePoint 2010 you MUST use Visual Studio 2010 Beta 2 for the Templates to work.

clip_image003

Above:  Create a new Project of type “Business Data Connectivity Model” the guy you need for BCS.  I have my VS 2010 set for C# only but you can do this with VB.NET also. I have named my Project “SPSDCEmployees”; this is important because I will be using this name in conjunction with the Entity Class to be created later on in this demo/lab.

clip_image004

Above:  Once you have selected and named your Project you are prompted to choose the site for debugging. I have already created a site called “http://tico/sites/BCSAlpha” for this venture and i have so identified it in my dialog box.

clip_image005

Above:  Once the Project is created, the first order of business is to create a connection to our database.  We are doing this as the means to:

  1. Create a connection to our LOB System
  2. Use it through LINQ to SQL as our model to abstract our Class/Entity

image

Above:  Once you click on Add Connection you will be presented with the dialog box above, please indicate your Server Name and the Database you are interested in.  In my example my Server is my doggie’s name “Tico” and the Database is called “FabianPlayPen” very apropos wouldn’t you say?

image

Above:  After connecting your Database we need to include another  Template to our project. This time we are including a “LINQ to SQL” Template as a means to create our Entity

image

Above:  By default and design, when you create a BCS Project an Entity called “Entity1” will be created, shortly we will remove that entity because as part of that process two classes are also created which we will subsequently delete. Reason being, there is a lot of code already inplace that we will need tie into, by deleting the Entity Object and the related Classes and subsequently recreating our own, we have  better control over our build process. In our example we named our New Item “FabianPlayPen” and a file called FabianPlayPen.dbml is crated in our solution.

image

Above:  The blank design window is what you are initially presented with and is the framework where we will model our Entity Class.

image

Above:  I followed the steps below:

  • On the View menu, click Server Explorer.
  • In Server Explorer, expand the node that represents the Employee database, and then expand the Tables node.
  • Drag the Employee table onto the O/R Designer.

image

Above:  The newly created entity is now present in the OR designer nomenclature is the name of the table in the LOB System.  An entity class is created and appears on the design surface. The entity class has properties that map to the columns in the Employee table.  Now that that process is complete, we need to do some clean-up to aid our design process.

image

Above:  In Solution Explorer we dobule click on BdcModel1.bdcm and we get the desing pane above.

  • In Solution Explorer, expand the BdcModel1 node, and then double-click the BdcModel1.bdcm file.
  • The Business Data Connectivity model file opens in the BDC designer.
  • In the designer, right-click Entity1, and then click Delete.
  • In Solution Explorer, right-click Entity1.cs, and then click Delete.
  • Right-click Entity1Service.cs, and then click Delete.

as you see below…

image

Above and Below: The process to delete the associated .cs files.

image

—————————————————————————————–

image

Above: We will now create our new entity which will abstract our Employee LOB System table from our FabianPlayPen database.

  • On the View menu, click Toolbox.
  • From the BusinessDataConnectivity tab of the Toolbox, drag an Entity onto the BDC designer.
  • The new entity appears on the designer. Visual Studio adds a file to the project named EntityService.cs
  • On the View menu, click Properties Window.
  • In the Properties window, set Name to Employee
  • On the designer, right-click the entity, click Add, and then click Identifier.
  • A new identifier appears on the entity.
  • In the Properties window, change the name of the identifier to EmployeeID

See Below

image

imageimage

Below is a representation of our work so far, it includes the newly created Entity and our Identifier. Next we will create our Methods to Create, Read, Update and Delete.

image

Above:  We will begin the process to create a Finder Method. This method is used to basically surface a List of “ALL” items in the database

  1. On the BDC designer, select the Employee entity.
  2. On the View menu, click Other Windows, and then click BDC Method Details.
  3. In the BDC Method Details window, from the Add a Method drop-down list, select Create Finder Method.

image

  1. Visual Studio adds a method, a return parameter, and a type descriptor.
  2. In the BDC Method Details window, click the drop-down list that appears for the EmployeeList type descriptor, and then click Edit as seen below

image

  1. The BDC Explorer opens. The BDC Explorer provides a hierarchical view of the model.
  2. In the Properties window, set the Type Name property to System.Collections.Generic.IEnumerable`1[SPSDCEmployees.Employee, BdcModel1] as seen below

image

image

  • In the BDC Explorer, expand the EmployeeList node and select the Contact node.
  • In the Properties window, set the Type Name property to SPSDCEmployees.Employee, BdcModel1.
  • In the BDC Explorer, right-click the Employee, and then click Add Type Descriptor.
  • A new type descriptor named TypeDescriptor1 appears in the BDC Explorer.
  • In the Properties window, set the Name property to EmployeeID.
  • Set the Type Name property to System.Int32.
  • From the Identifier drop-down list, select ContactID.
  • Repeat step 8 to create a type descriptor for each of the following fieldsAs seen in the below 3 ScreenShots.

    image

    Screen Shot 1

    image

    Screen Shot 2

    image

    Screen Shot 3

    Now we need to create the remainder of the Type Descriptors for the Employee Entity; here is where we go back to our LOB System or our Entity Class created earlier and get the Names and Data Type of the columns to create our TypeDescriptors. Once we have done that it is time to add the code for our  ReadList Method

    image

    Above:  Double-Click on the ReadList in the Employee Entity to enter the code view as seen below.  By default a method is created and we need to remove the entry in the method and replace with our own.

    image

    image

    Above:  Our code is inserted in the ReadList Method

    • A connection string is created to attach to our LOB System
    • An Instance of the Employee List is created and populated with all the data from the LOB System

    That it. Easy isnt it! Next we need to create a Specific Finder Method which is responsible for returning a single item as requested in the SharePoint UX. As before we go back to the BCS Designer to add the Method and add our code… see below next three screen shots.

    image

    image

    image

    1. In the BDC designer, select the Employee entity.
    2. In the BDC Method Details window, collapse the ReadList node.
    3. From the Add a Method drop-down list that appears below the ReadList method, select Create Specific Finder Method.
    4. Visual Studio adds the following elements to the model. These elements appear in the BDC Method Details window.
      1. A method named ReadItem.
      2. An input parameter for the method.
      3. A return parameter for the method.
      4. A type descriptor for each parameter.
      5. A method instance for the method.
    5. In the BDC designer, on the Employee entity, double-click the Readitem method and add the code you see in the second (2nd) screen shot.

    image

    image

    We will create two additional method Create and Update.. lets go with Create first then the Update Method.  As before we begin from the Entity and select new method from the BDC Method Details Pane. Click the Method and add the code as reflected the screen shot.

    image

    image

    image

    image

    image

    Next we create the Update Method

    image

    image

    TEST AND VERIFY

    Finally we get to deploy our solution and see it in action. Click build then Deploy Solution to get our code up to our Farm.

    image

    Above:  Click Build then Deploy Solution…

    image

    Above:  To verify that the solution is uploaded we go to Central Admin under Application Management, Click on Business Data Connectivity to see if the Build was uploaded to the server Farm, see below…

    image

    Above:  Evidenced that our External Content Type is on the Server Farm, we now move to creating our External List to surface the information abstracted by the External Content Type.

    image

    Above:  Under Site Actions, click Create More, then choose External List.

    image

    Above:  Select the External Content Type we created as above…

    image

    Above:  Create a name and ensure that we have the correct Data Source Configuration

    image

    Above:  So… Viola! we have our external content type representative of the SQL Database Table called Employee, neat huh!

    image

    Above:  as part of our verification process we have confirmation that our columns are consistent to the Entity and LOB System. Now lets kick the tires on the newly created methods..

    image

    Above:  Lets click “Add New Item” this will instantiate and fire off the Create Method of our External Content Type. The next four screen shots represent the new form, the entered values, the post and final resultant Read List with the created item.

    image

    Above: The blank auto-generate form when you click Add New Item

    image

    Above:  Filling in the form with what will be the new data

    image

    Above:  Awesomness! we have our newly created item in our List… later we will do a SQL query to validate the record. Next, let us investigate the Update Method…

    image

    Above:  In this example we click on the custom action by the Picker field and we elect the “Edit Item” Once we click it we see the below…

    image

    Above:  The item in question is noted in the Update Form… I am picking  on my buddy Todd Baginski here, he does and awesome work on BCS and other SharePoint 2010 elements. Visit him here

    image

    Above:  Well because his name is synonymous to  good ol Frodo I relocated Todd to the Shire…

    image

    Above:  Confirm the changes above…

    image

    Above:  Finally we check the LOB system and we can see our Create, and Our Update, come to the SPS DC for the Delete… LOL

  • December 3, 2009 Posted by | Business Connectivity Services, SharePoint 2010, SharePoint Development, SharePoint General, SharePoint How-To, SharePoint Saturdays, Visual Studio 2010 | , , | 50 Comments

    SharePoint 2010 Business Connectivity Services Teaser with Multiple External Content Types surfacing in One External List

    This is my first attempt at a webcast with Camtasia bear with me…

    In this teaser I am setting the stage of what we have already built and what we will be doing… to download the Podcast version click here or directly on Screencast.com page .

     

    image

    November 26, 2009 Posted by | Office 2010 Beta, SharePoint 2010, SharePoint How-To, Visual Studio 2010, Webcast | , , | 4 Comments

    The New Face of Visual Studio 2010 Ultimate Beta 2

    Need i say more…

    image

    November 12, 2009 Posted by | SharePoint 2010, SharePoint Development, SharePoint How-To, Visual Studio 2010 | , , , | Leave a comment