2014-10-29 2 views
3

Я пытаюсь использовать шаблон unitofwork и repository, и у меня есть следующий метод «обновления», который отлично работает, если я заменяю все элементы в строке таблицы (id, color, year).GenericRepository pattern Метод обновления

public virtual void Update(TEntity entityToUpdate) 
{ 
    dbSet.Attach(entityToUpdate); 
    (entityToUpdate).State = EntityState.Modified; 
} 

Но я хочу, чтобы обновить только определенные столбцы, которые я передаю (ID & цвет). он перезапишет остальные элементы (год).

Так, например, у меня есть запись базы данных в моей таблице Автомобили:

Id = 1, 
color = "red" 
year = 2010 

, если я обновлю это как так ...

var location = new Car 
{ 
    Id = 1, 
    color = "blue" 
}; 


unitOfWork.CarRepository.Update(car); 

запись сейчас:

Id = 1, 
color = "blue" 
year = null 

Как я могу переписать свой общий метод репозитория, чтобы просто изменить то, что я его кормлю? (т. е. сохранить значение года)

ответ

4

Вы не сможете сделать это с помощью шаблона общего шаблона репозитория. Вам действительно не нужно использовать этот шаблон. EntityFramework - это уже общий репозиторий, почему вам нужно его обернуть в другой общий репозиторий? Этот тип абстракции добавляет отрицательное значение.

Вы хотите инкапсулировать использование своей базы данных с вашего контроллера (в контроллере MVC никогда не должно быть DbContext), однако для этого вам не нужны специальные шаблоны. Просто введите DbContext в класс, который работает.

Также блок работы по большей части является анти-узором, если вы пропустите UOW вокруг. Это создает некоторые безумные проблемы связи в вашем приложении, которые полностью не связанный код способен воздействовать на совершенно другой сегмент кода.

Удаление основного хранилища и использование EF непосредственно в вашем сервисе/класс DAL/resource (что бы вы ни назвали его) позволит вам полностью функционировать EF. Это позволит делать частичные обновления очень тривиально.

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

+0

Как бы вы протестировали свою службу/DAL/ресурс при непосредственном использовании объекта? Разве вы не должны были бы издеваться над каждым методом сущности, используемым в методе (услугах) службы/DAL/ресурса, который вам нужно проверить, чтобы иметь возможность сделать это? – afarazit

+0

@afarazit Я никогда не издеваюсь над базой данных, это бессмысленно. Я издеваюсь над абстракцией, «DAL». Иногда это может означать, что мой издевающийся DAL использует словари для имитации персистентности для [быстрых] тестов интеграции. –

+0

@ChrisMarisic - Можете ли вы указать на какую-то статью, которая описывает реализацию насмешливого DAL вместо баз данных. Потому что я тоже высмеивал db, чтобы проверить свои услуги. – Nanu

0

Метод, который вы написали, предполагает, что вы начали с существующего объекта объекта с набором свойств. Репозиторий предполагает, что ваша бизнес-логика работает следующим образом:

var car = repo.GetCar(id); 

car.prop1 = "new value"; 
car.prop2 = "another new value"; 

repo.update(car); 

Это сохранит все предыдущие значения, которые вы установили.

+0

2 запросов для 1 обновления? – Piyey

Смежные вопросы