使用工作单元模式与实体框架保存多对多关系

时间:2014-01-20 20:38:15

标签: asp.net-mvc entity-framework unit-of-work

我想在ModelsOptions之间保存与EF的多对多关系。我非常确定我的模型设置正确,因为框架创建了一个OptionsModels表,我可以按预期检索和填充我的编辑视图数据。保存更改是我遇到问题的地方。

我的控制器中有以下代码(简化):

        //process the selected options            
        if (editModelModel.SelectedOptionIds.Any())
        {
            modelEntity.Options = new Collection<Option>();

            foreach (var id in editModelModel.SelectedOptionIds)
            {
                modelEntity.Options.Add(_optionService.GetOption(Convert.ToInt16(id)));
            }
        }

        _modelService.Update(modelEntity);
        _unitOfWork.Save();

ModelService课程中的更新方法:

    public void Update(Model entity)
    {
        _unitOfWork.GetRepository<Model>().Update(entity);
    }

SQL通用存储库方法:

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

当我运行此代码时,我没有得到任何错误,它只是不更新​​或向我的OptionModels表添加任何数据。我经历了很多帖子,但似乎无法找到我正在寻找的东西,这似乎应该是相当常见的知识。我必须错过一些小事......

1 个答案:

答案 0 :(得分:1)

我看到发生了什么。根据控制器和服务中的字段,您的控制器和服务中都显示私有_unitOfWork。这可能会导致您的问题,因为您可能正在通过服务的工作单元启动更新这是您的控制器工作单元,可以保存更改。

由于您似乎在实例化两个独立的工作单元,因此它们不会共享相同的上下文,因此无法看到对方正在做什么。

您可以将控制器的工作单元传递给服务,并确保所有图层共享相同的上下文,而不是在服务中实例化新的工作单元:

public class MyController{
   public MyController(){
      _uow = new UoW();
      _service = new ModelService(_uow);
   }
}