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.

image

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
SET NOCOUNT ON
;
WITH PersonHierarchy AS
(
SELECT PersonId, Name, ManagerId
FROM Person
WHERE PersonId = @personId
UNION ALL
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
GO

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 =
DataServiceProtocolVersion
.V2;
}

[WebGet]
public IQueryable<Person> GetFullPerson(int personId)
{
return this.CurrentDataSource.
SelectPersonHierarchy(personId).AsQueryable();
}
}

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;

this.CreateQuery<Person>("GetFullPerson")
.AddQueryOption("personId", personId).ToList().ForEach(
t =>
{
if (null == t.ManagerId)
root = t;
else
{
Person parent = this.FindManager(root, t.ManagerId.Value);
parent.Subordinates.Add(t);
}
});

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" };
context.AddToPeople(boss);

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

// 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
context.SaveChanges();

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)…


image


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…


image


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


image


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;

this.CreateQuery<Person>("GetFullPerson")
.AddQueryOption("personId", personId).ToList().ForEach(
t =>
{
if (null == t.ManagerId)
root = t;
else
{
Person parent = this.FindManager(root, t.ManagerId.Value);
parent.Subordinates.Add(t);
}
});

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…


image


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.

45 comments:

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 https://justdomyhomework.com/blog/funny-homework-answers-awards I found really funny info about homework and now I feel even more motivated.

Unknown 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 Australiaassignmenthelp.com provides your homework help.

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...

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.

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

Lisa Jones said...

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

Qasim Khan said...

Most budget gaming keyboards in this guide are under $50, and will be a stalwart companion to your gaming PC, but will be pretty barebones. As such, certain features will be omitted to keep the price...

Kumar Singh said...

Does closes our rundown of best android games under 1mb that chips away at pretty much every cell phone with no problem.

Unknown said...

FDM printing is one of the most sought-after 3D printing techniques in the world.
is a technology that works both horizontally and vertically, where an extrusion nozzle moves over a build platform. The process involves the use of thermoplastic material that reaches melting point and is then forced out, to create a 3D object layer by layer. As the design takes shape, it is clear to the see each layer as a horizontal cross section. Following the completion of one layer, the nozzle of the printer is lowered in order for the next layer of plastic to be added to the design. Once the object has been created, the materials that are used to support the object can then be removed.

Unknown said...

Hello friends, in today’s article we will see what is "MOSFET", what are its types, and what are its uses. The full name of MOSFET is Metal Oxide Semiconductor Field Effect Transistor. It is a semiconductor device used for the amplification of electronic signals in electronic devices for the purpose of a switch in electronic equipment.

MOSFET is a core or integrated circuit, where it is designed and forged into a single chip because the device is available in a very small size. The discovery of MOSFET has seen new changes in the field of electronic switching

Krunal said...

Shoring is a brief design used to forestall the breakdown of the fundamental under-development structure. It is for the most part needed to balance out the development pit dividers, keep water from infiltrating the pit, and secure adjoining structures.

Floating slabs are substantial slabs that are laying over the ground, with no sort of mooring, as though it essentially sits on it and buoys. Floating section, as the name advises it's anything but a plate that is just laid over water, with no sort of association between them. The principle utilization of floating slabs is to use as a base establishment for sheds, fabricating workshops, home extra room, or carports. It is affordable when utilized in regions any place the requirement for standard establishments isn't needed. The development subtleties are clarified exhaustively in the accompanying areas. At the point when we expect a structure with floating plan, we should picturize as a structure with a standard establishment of strip balance, that is developed a few feet beneath the ground.

mechanicaljungle said...

The name it self address that it will have two sliding sets and two turning sets in the twofold slider crank chain.

As you can see the above picture which is a model for the Double slider crank chain. In that, We have four components (two sliding components, one switch, opened one base).

The two sliding components joined by the switch component. This liver will make two turning sets with the two sliding components. The opened base which will make the two sliding sets with the sliding components.

The least complex sort of Centrifugal Governor is the Watt governor. In the past article, we have talked about the Centrifugal governer exhaustively. In this article, we will talk about the Watt Governor in more detail.

The fundamental working standard behind Watt governor is the adjusting of the radial power. So these go under the Centrifugal Governors.

Bhushan said...

What Is Shoring? shoring types is a temporary structure used to prevent the collapse of the main under-construction structure. It is generally required to stabilize the construction pit walls, prevent water.

monolithic slab construction is a procedure where utilizing a homogeneous mixture, a structure is monolithically constructed. It is a structure constructed from a sole material, assembled as well.

What Is 53 grade cement? The Grade assigned to cement indicates the rolling resistance of cement. The strength gained by concrete usually compressive strength is measured after 28 days after.


What Is a Pitched Roof? A pitched roof is a roof that has slopes downwards, typically in two halves at an angle from a central ridge, but sometimes in one part, from one edge to another.

𝖇𝖊𝖙𝖘𝖆𝖗𝖆𝖓𝖌885♡ said...

really like reading through a post that can make people think. Also, many thanks for permitting me to comment! 메이저사이트

𝖇𝖊𝖙𝖘𝖆𝖗𝖆𝖓𝖌885♡ said...

It’s a very easy on the eyes which makes it much more pleasant for me to come here and visit more often. 바카라사이트

𝖇𝖊𝖙𝖘𝖆𝖗𝖆𝖓𝖌885♡ said...

Everything is very open with a clear clarification of the issues. It was really informative. Your site is extremely helpful. Thanks for sharing! 사설토토

roulettesitetop said...

You delivered such an impressive piece to read, giving every subject enlightenment for us to gain information. Thanks for sharing such information with us due to which my several concepts have been cleared 룰렛

roulettesitetop said...

Fabulous post, you have denoted out some fantastic points, I likewise think this s a very wonderful website. 카지노사이트

casinositeguide.com said...

I would recommend your website to everyone. You have a very good gloss. Write more high-quality articles. I support you. 카지노사이트

casinosite.one said...

This article is very detailed And i am happy reading this!! cheers 카지노사이트

casinosite.zone said...

You have made some good points there. 온라인카지노

sdgssss said...

Hello! I know this is kinda off topic but I'd figured I'd ask.
Would you be interested in trading links or maybe guest writing a
blog post or vice-versa? My website goes over a lot of the same subjects as yours And
I think we could greatly benefit from each other.
If you are interested feel free to send me an email.
I look forward to hearing from you! Great blog by the
way! 카지노사이트

Kumar Singh said...

win iphones for free at absolutely cost by following some simple surveys

alone said...

When I read your article on this topic, the first thought seems profound and difficult. There is also a bulletin board for discussion of articles and photos similar to this topic on my site, but I would like to visit once when I have time to discuss this topic. sòng bạc


NOMO said...

I’m very pleased to discover this site. I want to to thank you for ones time for this particularly wonderful read!! I definitely savored every part of it and i also have you saved as a favorite to see new information on your blog. 사설토토사이트


Unknown said...

After looking into a number of the articles on your website, I really like your technique of blogging.
I book marked it to my bookmark website list and will be checking back soon. Please visit my web site as well and let me know your opinion.


https://www.totositehot.com

NOMO said...

Youre so right. Im there with you. Your weblog is definitely worth a read if anyone comes throughout it. Im lucky I did because now Ive received a whole new view of this. 샌즈카지노


NT said...

When I read an article on this topic, 카지노사이트검증 the first thought was profound and difficult, and I wondered if others could understand.. My site has a discussion board for articles and photos similar to this topic. Could you please visit me when you have time to discuss this topic?


alone said...

Your ideas inspired me very much. roulette It's amazing. I want to learn your writing skills. In fact, I also have a website. If you are okay, please visit once and leave your opinion. Thank you.


NOMO said...

Youre so right. Im there with you. Your weblog is definitely worth a read if anyone comes throughout it. Im lucky I did because now Ive received a whole new view of this. 메이저사이트추천


Unknown said...

HOW TO PLAY ROULETTE - All You Need to Know About 샌즈카지노 우리카지노 온라인카지노 Roulette

Unknown said...

Quel poste fantastique. C'est plein d'informations précieuses. C'est probablement le meilleur.
Guide le plus concis étape par étape. Je n'ai jamais vu un tel post.
Merci pour ce blog si agréable et si instructif.


https://www.safetotosite.pro

NOMO said...

I finally found what I was looking for! I'm so happy. 우리카지노


Anonymous said...
This comment has been removed by the author.
Unknown said...

Hola, estoy aquí por primera vez. Me encontré con este tablero y encontré
Realmente útil y me ayudó mucho. Espero dar algo a cambio
y ayuda a otros como tú me ayudaste.


https://www.safecasinosite.net

GovtAssistances said...

Thankfully yes. There are various Dental Implant Grants available for individuals with low income and also low income families.

Rajeshbariya said...
This comment has been removed by the author.
Unknown said...

thank you for penning this simple and thrilling weblog. It's miles very easy to apprehend. I'm absolutely inspired and need to realize your efforts. 먹튀검증

Unknown said...

this is an fantastic motivating article. I'm nearly happy with your 가입머니 즉시지급

keven john said...

WCF Data Services supports the selection of hierarchical data through the use of expand options. The expand option allows you to include related entities in the result set of a query, and also to include related entities of related entities.If you are looking to buy an online Dissertation Help London service turn out to the dissertation writing help for all the academic work.

Online Business Review said...

Improve your lifestyle to lose weight. A planned diet and some exercise, do not make a difference if you still eat junk food, drink, have poor sleep or smoke on a regular basis. How you treat yourself, can make the difference between gaining a few pounds and losing a great deal of weight.

WEBSITE:

https://www.outlookindia.com/outlook-spotlight/phenq-reviews-do-these-weight-loss-pills-work-ingredients-benefits-side-effects-discount-code-news-315150

Online Health Care Supplement Reviews said...

Much obliged for such smart thoughts you shared. Coming to your site is generally a chance to discover some new information.

https://www.outlookindia.com/outlook-spotlight/glucotrust-reviews-does-blood-sugar-supplement-work-must-read-ingredients-benefits-amazon-where-to-buy-usa-canada-australia--news-274014

raelynn said...

I look forward to reading more of your enlightening posts in the future!Note of Issue Contested Divorce New York