Entity Framework 4.1 Code First: добавление и обновление записей через сервисный уровень - PullRequest
1 голос
/ 06 июня 2011

Я использую Entity Framework 4.1 Code First и ASP.NET MVC 3.

У меня есть класс обслуживания, и в этом классе я вызываю методы репозитория.

Я получил добавлениенового учебного объекта для работы, я просто не знаю, как обновить запись.Вот мои методы вставки и обновления для службы:

public class TutorialService : ITutorialService
{
   private ITutorialRepository tutorialRepository;

   public TutorialService(ITutorialRepository tutorialRepository)
   {
      this.tutorialRepository = tutorialRepository;
   }

   public void Insert(Tutorial tutorial)
   {
      tutorialRepository.Add(tutorial);
      tutorialRepository.Save();
   }

   public void Update(Tutorial tutorial)
   {
      // Not sure what the code looks like here to call the repo methods
   }
}

Мой класс репозитория:

public class TutorialRepository : ITutorialRepository
{
   PbeContext db = new PbeContext();

   public void Add(Tutorial tutorial)
   {
      db.Tutorials.Add(tutorial);
   }

   public void Save()
   {
      db.SaveChanges();
   }
}

Класс контроллера:

public ActionResult Edit(EditTutorialViewModel editTutorialViewModel)
{
   // Other code

   if (!ModelState.IsValid)
   {
      return View("Edit", editTutorialViewModel);
   }

   // Mapping code here to Tutorial object
   Tutorial tutorial = (Tutorial)tutorialMapper.Map(editTutorialViewModel, typeof(EditTutorialViewModel), typeof(Tutorial));

   // Update the existing tutorial
   tutorialService.Update(tutorial);

   return RedirectToRoute(Url.TutorialList());
}

Какой будет код обновлениявыглядит как?Есть ли более простой способ сделать это?

Ответы [ 2 ]

5 голосов
/ 06 июня 2011

В вашем хранилище:

public void UpdateScalar(Tutorial tutorial)
{
    var original = db.Tutorials.Find(tutorial.ID);
    db.Entry(original).CurrentValues.SetValues(tutorial);
}

А затем в вашем сервисе:

public void Update(Tutorial tutorial)
{
    tutorialRepository.UpdateScalar(tutorial);
    tutorialRepository.Save();
}

Решение Tigger также работает и имеет то преимущество, что нет необходимости загружать оригинал дообновление.С другой стороны, установка состояния Modified заставляет все свойства отправляться в БД в операторе UPDATE, независимо от того, изменились они или нет.Приведенное выше решение только отправляет измененные свойства в БД, но требует предварительно загрузить оригинал.

Оба решения работают только со скалярными свойствами.Как только задействуются более сложные графы объектов и свойства навигации, обновление становится более сложным.

4 голосов
/ 06 июня 2011

Вы можете использовать один и тот же метод сохранения в классе репозитория как для вставки, так и для обновления, например,

public void Save(Tutorial tutorial)   
{   
   db.Entry(tutorial).State = tutorial.Id == 0
                                     ? EntityState.Added
                                     : EntityState.Modified;

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