Как подделать свойства коллекций внешних ключей в Entity Framework и ASP.NET MVC - PullRequest
3 голосов
/ 29 мая 2009

В блоге Алекса Джеймса Как подделать свойства внешнего ключа в .NET 3.5 SP1 , он объясняет, как добавить свойство внешнего ключа в объект сущности.

Я использовал это, чтобы получить свойство ссылки / навигации, работающее с DropDownList в строго типизированном приложении ASP.NET MVC, как описано здесь:

Сильно типизированный ASP.NET MVC с ADO.NET Entity Framework

Мне нужно также обрабатывать коллекции. Я могу использовать CheckBoxList Тайлера Гарлика, а не встроенный DropDownList.

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

Но как мне расширить ObjectContext и мои EntityObjects для обработки отношений типа один ко многим?

Расширить ли мой класс Department EntityObject для включения свойства PersonIds типа Generic List of Guid? Как мне обращаться с установленным аксессором?

1 Ответ

1 голос
/ 29 мая 2009

Я предполагаю, что вы можете добавить выбранные идентификаторы людей в метод действия, и все люди уже существуют в базе данных ... потому что эта форма просто создает отношения с людьми и обновляет сам отдел, а не создает новый персонал .

В этом случае вы хотите сделать что-то вроде этого (псевдо-код):

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

Это, по сути, то, что вам нужно сделать ..

Надеюсь, это поможет

Alex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...