или один из наших проектов (C# Windows Service, в основном для обработки данных из внешних ресурсов и чтения/записи этих данных в базу данных SQL Server), мы реализовали шаблон хранилища в DAL, и мы создали класс репозитория для каждого POCO (который представляет собой таблицу). Использование этих классов репозитория управляется шаблоном Unit of Work, поэтому все репозитории совместно используют один и тот же DbContext в одной единице работы, но, возможно, это не имеет отношения к вопросу.Шаблон репозитория Framework Entity Framework в DAL, как реализовать функции обновления?
Репозиторий класс для, скажем, объект клиента, осуществляется следующим образом:
public class CustomerRepository
{
private readonly MyContext _context;
public CustomerRepository(MyContext context)
{
_context = context;
}
public Customer GetCustomer(string id)
{
return _context.Customers.Find(new object[] {id});
}
public IEnumerable<Customer> GetAllCustomers(Func<Customer,bool> predicate)
{
return _context.Customers.Where(predicate);
}
public IEnumerable<Customer> GetCustomerByCity(string city)
{
return _context.Customers.Where(c=>s.City.Equals(city));
}
public void SetAge(string id, byte age)
{
_context.Customers.Find(new object[] { id }).Age = age;
}
public void Update(Customer customer)
{
_context.Entry(customer).State = EntityState.Modified;
}
}
Теперь у меня есть несколько вопросов о том, что лучшая практика для обновления-методов:
- Рекомендуется ли иметь отдельные методы для обновления определенных полей в базе данных, например метода SetAge()?
- Или Рекомендуется получить объект Customer для нашего BLL (с GetCustomer (id)) и просто установить свойства в BLL как customer.Age = 35 ;, а затем сохранить эти изменения?
Операции обновления в основном ограничиваются одним полем в одной строке.
Может быть, кто-нибудь хотел бы поделиться с нами некоторыми реальными мыслями?
Если вы думаете о практичности, имеющих определенную операцию обновления для всех свойств, то ответ достаточно очевиден. Кроме того, такой подход, вероятно, не будет масштабироваться очень хорошо, учитывая, что вы будете делать несколько поездок в БД для обновления одного и того же объекта. – James
@James Операции обновления в основном ограничиваются одним полем в одной строке, поэтому наличие нескольких обращений в оба конца здесь не является проблемой. Насколько это уместно, изменения отслеживаются Entity Framework (изменения остаются в памяти), и запись будет передана базе данных за одну поездку при вызове SaveChanges на нашем объекте контекста. – Jeroen1984
хорошо для меня, 'SetAge' является логикой домена и, как таковой, действительно не принадлежит слою репозитория. Если вы спрашиваете, есть ли какой-либо * вред * при выполнении того, что вы делаете, тогда ответ отрицательный. Однако рассматривать такие вещи, как влияние редактирования объекта, будет, например, удаление/переименование свойства или добавление нового свойства. Все, что вы действительно делаете, это лишняя дополнительная работа, EF достаточно умна, чтобы обновлять только то, что изменилось. – James