2013-02-20 157 views
0

幫我解決這個問題,我真的很困惑!通過實體框架更新

我只想更新一些東西!這是我的控制器(POST操作):

[HttpPost] 
public ActionResult Edit(CategoryViewModel categoryViewModel) 
{ 
      if(ModelState.IsValid) 
      { 
       _categoryService.UpdateCategory(categoryViewModel.Id); 
      } 
      return View(); 
} 

,這是我的服務類(我的問題是關於這一類的,我不知道如何更新)

public CategoryViewModel UpdateCategory(Guid categoryId) 
{ 
      var category = _unitOfWork.CategoryRepository.FindBy(categoryId); 
      var categoryViewModel = category.ConvertToCategoryViewModel(); 
      _unitOfWork.CategoryRepository.Update(category); 
      _unitOfWork.SaveChanges(); 
      return categoryViewModel; 
} 

最後我基礎信息庫是這樣的:

private readonly DbSet<T> _entitySet; 

public void Update(T entity) 
{ 
      _entitySet.Attach(entity); 
} 

也是我UnitOfWork是這樣的:

public class UnitOfWork : IUnitOfWork 
{ 
    private IRepository<Category> _categoryRepository; 

    public IRepository<Category> CategoryRepository 
    { 
      get { return _categoryRepository ?? (_categoryRepository = new Repository<Category>(_statosContext)); } 
    } 
} 
+2

更新'category'對象屬性的代碼在哪裏? – 2013-02-20 16:23:07

+1

另外,我推測你的'_unitOfWork'變量是'DbContext'或'ObjectContext'派生的對象。真的嗎?如果不是,你的'SaveChanges'函數的主體是什麼? – 2013-02-20 16:26:25

+0

是的,我的_UnitOfWork variabel ID DbCotext,但我的麻煩是在服務類,基本上我有問題的算法,儘管我編輯我的問題也與我的UnitOfwork – 2013-02-20 16:30:27

回答

0

更改UpdateCategory接受CategoryViewModel而不僅僅是Guid。將實例UpdateFromViewModel(CategoryViewModel model)方法添加到Category對象,該對象的任務是從模型中獲取屬性並將其傳送到EF實體。之後,其餘的代碼應該可以工作。還有其他模式可以用來實現這一點,但考慮到您現有的模式,這應該讓您跨越終點線。

public class Category 
{ 
    public void LoadFromModel(CategoryViewModel model) 
    { 
     // Transfer properties from model to entity here 
    } 
} 

public class CategoryService 
{ 
    public void UpdateCategory(CategoryViewModel model) 
    { 
     var category = _unitOfWork.CategoryRepository.FindBy(model.CategoryId); 
     category.LoadFromModel(model); 
     _unitOfWork.SaveChanges(); 
     model.CategoryId = category.CategoryId; 
    } 
} 
+0

謝謝我改變了我的服務方法,像這樣公衆類別更新類別(CategoryViewModel categoryViewModel) { var category = categoryViewModel.ConvertToCategoryModel(); _unitOfWork.CategoryRepository.Update(category); _unitOfWork.SaveChanges(); 返回類別; } – 2013-02-20 16:55:59

+0

但現在我遇到了公共無效更新(T實體) _entitySet.Attach(entity); } 對我說ObjectStateManager中已經存在具有相同鍵的對象。 ObjectStateManager不能使用同一個鍵跟蹤多個對象。 Dbset <>更新實體的規則是什麼? – 2013-02-20 16:57:42

+0

對不起,我感到困惑。我的意圖是讓你首先使用Guid從Context中加載實體,然後調用'Category'類的實例函數將Model屬性映射到Entity屬性。這樣你就可以正確地連接對象。有了這個改變,你可以刪除'CategoryRepository'中的'Update'調用。 – 2013-02-20 17:21:56