How to fake properties of foreign key collections in Entity Framework and ASP.NET MVC

In a blog post by Alex James, How to fake foreign key properties in .NET 3.5 SP1 , he explains how to add a foreign key property to an Entity object.

I used this to get the reference / navigation property working with DropDownList in a strongly typed ASP.NET MVC application, as described here:

Strongly typed ASP.NET MVC with Entity Framework ADO.NET

I also need to handle collections. I can use Tyler Garlick CheckBoxList and not the built-in DropDownList.

ASP.NET MVC with CheckBoxList http://img241.imageshack.us/img241/5197/checkboxlistpeople.gif

But how can I extend the ObjectContext and my EntityObjects to handle one-to-many relationships?

Extending my EntityObject class to include a PersonIds property of type Generic List of Guid? How can I handle an installed accessory?

+3
asp.net-mvc entity-framework
May 28 '09 at 21:53
source share
1 answer

I assume that you can get the selected Person identifier in the Action method, and all People already exist in the database ... because this form simply creates relationships with people and updates the department itself without creating new employees.

In this case, you want to do something like this (psuedo-code):

// get the department from the form using the model binder Department updated = ... ; // get the ids of the selected people from the form too. var currentlySelectedStaffIds = ...; // get the original department from the database // including the originally related staff Department original = ctx.Departments.Include("Staff") .First(dep => dep.Id = updated.Id); // get the ids of all the originally related staff var originalStaffIds = original.Staff.Select(s => s.Id).ToArray(); // get the People to be removed from the department var removedStaff = (from staff in original.Staff where !currentlySelectedStaffIds.Contains(staff.Id) select staff).ToArray(); // get People added to the department (but attached to the context) var addedStaff = currentlySelectedStaffIds.Except(originalStaffIds) .Select(id => new Person {Id = id}).ToArray(); // Remove the original staff no longer selected. foreach(var removed in removedStaff) { original.Staff.Remove(removed); } // Attach the 'added' staff and build a new relationship for each one foreach(var added in addedStaff){ //Put the staff added to the department in the context ctx.AttachTo("People", added); // build a new relationship original.Staff.Add(added); } // Apply the changes from updated to the original entity ctx.ApplyPropertyChanges("Departments", updated); ctx.SaveChanges(); 

This is essentially what you need to do.

Hope this helps

Alex

+1
May 29 '09 at 1:36 a.m.
source share



All Articles