Это совсем не плохо. Очень похоже на нашу настройку.
Пара указателей:
1 - Используйте дженерики для ваших репозиториев. Ваш код для Attach очень прост, и его не нужно дублировать среди сущностей. Если вы создали GenericRepository<T>
, тогда ваш код вложения будет:
public T Attach<T>(T entity) where T : class
{
Context.GetEntitySet<T>.Attach(entity); // pluralization on (typeof)T.name to get entity set
Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
return entity;
}
2 - я бы разделил метод UpdatePhones
на отдельные методы. Я бы не стал полагаться на флаг (IsDeleted и т. Д.) Для определения направления действий. Я был бы более явным.
3 - Похоже, у вас есть PhoneRepository
? Зачем? Person
- это ваш сводный корень, а Phone
всегда связан с конкретным Person
, поэтому у вас должен быть только PersonRepository
в этой совокупной границе. Вы должны присоединиться к Phones
ObjectSet` определенного человека.
Кстати - я предполагаю, что у вас отложенная загрузка отключена? В противном случае эти операции LINQ над ICollection будут вызывать автоматические обходы.
Помимо вышеперечисленных моментов (которые в основном связаны с дизайном), с точки зрения оптимизации ваш код выглядит хорошо для меня.
И последнее замечание - есть еще один рекомендуемый метод (Алекс Джеймс) для обновления сущностей в отдельном контексте (он же MVC), который называется «технология-заглушка».
Я задал вопрос (и решил его сам) несколько дней назад, если вам интересно, проверьте его .
НТН.