【问题标题】:Update via Entity Framework通过实体框架更新
【发布时间】:2013-02-20 16:19:53
【问题描述】:

帮帮我,我真的很困惑!

我只是想更新一些东西!这是我的控制器(后期操作):

[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)); }
    }
}

【问题讨论】:

  • 更新category对象属性的代码在哪里?
  • 另外,我假设您的 _unitOfWork 变量是 DbContextObjectContext 派生对象。真的吗?如果不是,您的 SaveChanges 函数的主体是什么?
  • 是的,我的 _UnitOfWork variabel id DbCotext,但我的麻烦在于服务类,基本上我的算法有问题,虽然我也用我的 UnitOfwork 编辑我的问题
  • 正如我提到的,我的问题在于 UpdateCategory(Guid categoryId),我不知道如何通过获取较早的名称并用新的替换来更新类别的名称...跨度>
  • 再次,在您的UpdateCategory 中,我看不到您在哪里更新了category 变量的属性。这是在哪里发生的?如果您从不更新属性,那么在调用 SaveChanges 时 EF 将不执行任何操作。

标签: c# asp.net-mvc-3 entity-framework


【解决方案1】:

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;
    }
}

【讨论】:

  • 谢谢我改变了我的服务方法,像这样 public Category UpdateCategory(CategoryViewModel categoryViewModel) { var category = categoryViewModel.ConvertToCategoryModel(); _unitOfWork.CategoryRepository.Update(category); _unitOfWork.SaveChanges();返回类别; }
  • 但现在我遇到了 public void Update(T entity) { _entitySet.Attach(entity); } 这对我说 ObjectStateManager 中已经存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象。 Dbset 更新实体的规则是什么??
  • 很抱歉给您带来了困惑。我的意图是让您首先使用 Guid 从上下文加载实体,然后在 Category 类上调用实例函数以将模型属性映射到实体属性。这样,您将使用正确附加的对象。通过此更改,您可以在 CategoryRepository 中删除您的 Update 呼叫。
  • 对不起,我没明白!所以你知道这方面的任何样本吗?
  • 你确定吗??我在域层中的类别类,而我的 CategoryViewModl 在服务层中!模型应该是 POCO 并且不应该对任何层(例如服务)有任何引用
猜你喜欢
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多