Monday, 10 September 2012

Selecting Hierarchical data with WCF Data Services

In this post I’ll describe how you can use hierarchical data with WCF Data Services as it’s not immediately obvious how to do this, and there’s also an issue (which I believe to be a bug) that needs to be addressed in order for it to work.

In this example I have a simple table shown below, with a hierarchical link between employees. The keys are integers, defined as IDENTITY columns in SQL server. All the code for this example is attached to this post if you should wish to look into it further.


I’ve also created a stored procedure that selects people in a hierarchical manner using a CTE. This is as follows…

-- Create an SP that selects a hierarchical set of data
CREATE PROCEDURE SelectPersonHierarchy(@personId int) AS
WITH PersonHierarchy AS
SELECT PersonId, Name, ManagerId
FROM Person
WHERE PersonId = @personId
SELECT p.PersonId, p.Name, p.ManagerId
FROM Person p
INNER JOIN PersonHierarchy ph
ON p.ManagerId = ph.PersonId
SELECT PersonId, Name, ManagerId
FROM PersonHierarchy

So far so good. Next I created an EF model that includes the table above and the stored procedure too. Then I created a simple WCF data service as shown below – the extra method is used to expose the hierarchical stored procedure, so that clients can call it directly.

public class PersonService : DataService<PersonEntities>
public static void InitializeService(DataServiceConfiguration config)
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);

// And set the protocol version used
config.DataServiceBehavior.MaxProtocolVersion =

public IQueryable<Person> GetFullPerson(int personId)
return this.CurrentDataSource.

Next I created the client for this service using Add Service Reference. Then I created a method that would call the GetFullPerson method on the server, the outline of which is shown below…

public Person GetFullPerson(int personId, bool makeItWork)
Person root = null;

.AddQueryOption("personId", personId).ToList().ForEach(
t =>
if (null == t.ManagerId)
root = t;
Person parent = this.FindManager(root, t.ManagerId.Value);

return root;

This method converts the data returned from the WCF operation to a list, iterates through that list and builds the client Person hierarchy (using a small helper function FindManager which, given a tree of objects, looks for the manager of the current person).

So, with all that in place we can write some unit tests to test the service. In my tests I’ve just used Boss and Employee as my two people. First off we’ll insert a Boss and an Employee & link them together…

Uri geller = new Uri("http://localhost:11341/PersonService.svc");
ServerService.PersonEntities context =
new ServerService.PersonEntities(geller);

// Insert hierarchical data to test with
var boss = new ServerService.Person { Name = "Boss" };

var employee = new ServerService.Person { Name = "Employee", Manager = boss };

// Important to add this - otherwise EF won't record the parent/child
// link in the database
context.AddLink(boss, "Subordinates", employee);

// Now save this to the server

Apologies for the awful pun in the Uri variable, I just can’t help myself. Here I create a boss, add an employee and then save the changes to the database. The important thing to mention is that you must also call context.AddLink() to ensure that there is a link between the parent and child objects. Here “Subordinates” is the name of the EF navigation property that is mapped from the parent of the relationship to the child. After saving these changes in the database you’ll see the following in the DB (Id’s will differ)…


OK, so far so good, we can create and save data to the server.

The Problem

The next thing I wanted to do was to verify that I could reload a person (in a hierarchical manner). So, my unit test was basically as follows…

  • Create a Boss and an Employee

  • Save these to the database

  • Reload these and test that all data was correct, including the link between employee and boss. This is where it all started to go wrong.

The reload code wasn’t working properly, and I tracked it down to the ManagerId field (after a fair amount of time). First I used Fiddler to log what was coming down from the server. My request looked OK…


And the data coming back from the server also looked OK…


However in my code that was looping through the data that came from the server the ManagerId was always null, for each and every row returned from the server.

In another test however it was fine – what gives?

The Solution

My two unit tests were identical – well, nearly. One verified what it got inline, another called a method to do that verification and the crucial difference was that the one that worked used a new service context. So, if you create a hierarchy of Boss & Employee on the client, save changes and reload (using the same client proxy), the hierarchical link is broken. If however you create a new client proxy and call the server everything works as expected.

My solution to this was to include the following in the method that calls the server…

public Person GetFullPerson(int personId)
Person root = null;

var currentMergeOption = this.MergeOption;
this.MergeOption = MergeOption.OverwriteChanges;

.AddQueryOption("personId", personId).ToList().ForEach(
t =>
if (null == t.ManagerId)
root = t;
Person parent = this.FindManager(root, t.ManagerId.Value);

this.MergeOption = currentMergeOption;

return root;

This ensures that the data read from the server overwrites the data on the client, and in this instance that’s enough for the ManagerId to be set correctly rather than being Null.

Example Code

The following is a link to a .zip file that contains the same code. You’ll find a database script in the EFHierarchyProblem project called SchemaAndLogic.sql. Run this against your database.

You should also update the database connection strings in each project to reference your database. There are 3 projects in the solution, a class library that contains the EF model and the service, a Web project that exposes that service, and a Test project that runs the unit tests. When you run the tests you should see the following in the test results window…


The Test_ServerService_WillFail should work but doesn’t, as the ManagerId is overwritten when reloading the data. The _WillWorkSameContext test uses the merge option to overwrite local data to ensure that the ManagerId isn’t overwritten, and the _WillWorkNewContext test inserts data but then requests it from a new client proxy which will always work.

The .zip can be downloaded from here.


ashtonmullens said...

In the case of drastically changing functions, it should be borne in mind that the program may not notice a sharp change of function. Suppose that when a member is of degree s, and let a real integral function remain the same. Where g (x) is practically different from 0 only on a small segment in the Maths assignment and college essay for sale sample.

Richard Majece said...

I like to look for different useful info online. On I found really funny info about homework and now I feel even more motivated.

Michael Jones said...

Programming Assignment help
I understand that it becomes difficult to take out time for assignments and other academic works, due to the busy schedule. But with Programming Assignment Help one can solve this issue as well. Make sure that you take the help of a genuine writing service as these services can help you understand the basics from the first level.

Domenic Tylor said...

Today race is very high for a better career and job. We need to do very much hard work to get a good job and a successful career. However, we are felling some absence of knowledge due to weak basics in our academics. Therefore, do more focus on your basics provides your homework help.

james cook said...

It is nice to read such high-quality content. It is a good article that discusses the topic at hand quite well. I am looking forward to read more articles from your site. Keep up the good work.
assignment help

Angel Claudia said...

Our Pay for pre written essays for sale services and legitimate essay writing company makes your college life bearable and fulfilling by enabling you to pass your exams and also in other research and essay writing tasks.

Assignment Help said...

I appreciate the effort you made to share the knowledge. This is really great stuff for sharing. We also provide an assignment to help Australia students.
Data Structure Assignment Help

KeiraDoltan said...

Nice Blog! As you may know, it is generally an Assignment assigned to students towards the end of their semester. Naturally, students find it difficult to focus on the task while preparing for the finals simultaneously. If you are also facing such a problem,
Make My Assignment are here to help.

Puremelda said...

All our writers understand Already Written Essays standards, and they are always ready to work for you. Students can Cheap Custom Term Papers in any field and on any level of education.

Devi.Angularjs said...

IEEE Project Domain management in software engineering is distinct from traditional project deveopment in that software projects have a unique lifecycle process that requires multiple rounds of testing, updating, and faculty feedback. A IEEE Domain project Final Year Projects for CSE system development life cycle is essentially a phased project model that defines the organizational constraints of a large-scale systems project. The methods used in a IEEE DOmain Project systems development life cycle strategy Project Centers in Chennai For CSE provide clearly defined phases of work to plan, design, test, deploy, and maintain information systems.

This is enough for me. I want to write software that anyone can use, and virtually everyone who has an internet connected device with a screen can use apps written in JavaScript. JavaScript Training in Chennai JavaScript was used for little more than mouse hover animations and little calculations to make static websites feel more interactive. Let’s assume 90% of all websites using JavaScript use it in a trivial way. That still leaves 150 million substantial JavaScript Training in Chennai JavaScript applications.

Puremelda said...

As much as an Affordable Term Papers is a summary of other works that should not be an excuse to many Pre Written Research Paper with plagiarized work. They ensure that the arguments are presented in a discussion and reflective manner to maintain the aspect of originality as well as show the audience that they understand what they are presenting on the Buy Pre Written Essays.

meldaresearchusa said...

Among the most popular Legitimate Essay Writing Serviceprovided to students is Medical Term Papersintended to meet your academic needs,as well as Legitimate Essay Writing Services.

Florahmelda said...

Do you require Genuine Nursing Research Papers from a trusted Nursing Research Papers Writing Service and Reliable Nursing Assignment Help firm which guarantees high-quality Papers for the client?

noor said...

نقل عفش من الدمام الى الرياض نقل عفش من الدمام الى الرياض
ارخص نقل عفش بمكة ارخص نقل عفش بمكة
نقل عفش من جدة الى الاردن نقل عفش من جدة الى الاردن

for ict 99 said...

Great Article. Thank you for sharing! Really an awesome post for every one.

IEEE Final Year projects Project Centers in Chennai are consistently sought after. Final Year Students Projects take a shot at them to improve their aptitudes, while specialists like the enjoyment in interfering with innovation. For experts, it's an alternate ball game through and through. Smaller than expected IEEE Final Year project centers ground for all fragments of CSE & IT engineers hoping to assemble. Final Year Project Domains for IT It gives you tips and rules that is progressively critical to consider while choosing any final year project point.

JavaScript Training in Chennai

JavaScript Training in Chennai

Teresa Halminton said...

If you are interested in your favorite actors' birthday, please take a look at celebrity birthdays database.

Scott Stayris said...

Quickbooks is the accounting software that helps to manage business-related transactions. This tool has many premium features to grow your business. Quickbooks File Restore said...

Hi i'm Nitu Roy a gorgeous Guwahati, Guwahati Escorts who is prepared to offer
you top quality of fun and unstoppable service with none restriction. i'm a
well-educated and therefore the best immense love provider where I also can
show you each sexual drive which provides you the simplest love feelings
and once you probably did the simplest sensual love with me, you usually
await subsequent meet.
Call Girl
Call Girl
Call Girl
Call Girl

Lisa Jones said...

Do you have any video of that? I’d love to find out some additional information... 먹튀

GOGOLIVE said...

Looking at this article, I miss the time when I didn't wear a mask. 온라인바둑이 Hopefully this corona will end soon. My blog is a blog that mainly posts pictures of daily life before Corona and landscapes at that time. If you want to remember that time again, please visit us.