通用存储库+工作单元+业务实体+业务服务+数据访问+实体框架层调用存储过程

时间:2016-12-16 16:42:22

标签: c# entity-framework stored-procedures

我有这么长的头衔,希望能够吸引更广泛的观众,因为我不确定如何继续。我正在尝试使用工作单元和存储库模式编写一个通用存储库来执行存储过程。

我的解决方案中有4个项目

用于控制poco的商业实体以映射我的实体(关注点分离)

商业服务这些包含我的界面和服务合同

 public interface ItblAnswerServices
    {
        tblAnswerEntity GettblAnswerByID(int tblAnswerID);
        IEnumerable<tblAnswerEntity> GetAlltblAnswers();
        int CreatetblAnswer(tblAnswerEntity tblAnswer);
        bool UpdatetblAnswer(int tblAnswerid, tblAnswerEntity tblAnswer);
        bool DeletetblAnswer(int tblAnswerid);
    }




/// <summary>
        /// Updates a tblAnswer
        /// </summary>
        /// <param name="tblAnswerId"></param>
        /// <param name="tblAnswerEntity"></param>
        /// <returns></returns>
        public bool UpdatetblAnswer(int tblAnswerID, BusinessEntites.tblAnswerEntity tblAnswerEntity)
        {
            var success = false;
            if (tblAnswerEntity != null)
            {
                using (var scope = new TransactionScope())
                {
                    var tblAnswer = _unitOfWork.tblAnswerRepository.GetByID(tblAnswerID);
                    if (tblAnswer != null)
                    {
                        tblAnswer.QuestionID = tblAnswerEntity.QuestionID;
                        tblAnswer.AnswerText = tblAnswerEntity.AnswerText;
                        tblAnswer.Correct = tblAnswerEntity.Correct;

                        _unitOfWork.tblAnswerRepository.Update(tblAnswer);
                        _unitOfWork.Save();
                        scope.Complete();
                        success = true;
                    }
                }
            }
            return success;
        }

DataAccess这包含我的通用存储库以及我的工作单元和我的EF6数据库实体模型连接(.edmx文件)

在我的通用存储库中我试图使用

  public IEnumerable<T> ExecWithStoreProcedure<T>(string query)
        {
            return Context.Database.SqlQuery<T>(query);
        }

我不想列出我的所有存储过程(有很多),但如果我必须在UnitOfWork中,我会。我可以在这里使用通用方法吗?我的EF模型实际上确实要调用其中的所有SP。我需要通过HTTP动词调用我的Web API。

1 个答案:

答案 0 :(得分:0)

我不确定这个问题的问题是什么,但我会给你一些一般的建议:

  1. 我假设你首先使用Schema或者首先使用Model(你提到.edmx文件)。您可以使用edmx designer生成存储过程调用,您可以从here获取信息。
  2. 如果您坚持使用存储库上的自定义通用调用样式(基于您的示例),那么您必须为SP编写包装器方法(类似于您的)。您可以使用一点T4模板魔术(文本模板转换工具)加快这项工作。阅读更多相关信息here。 在这种情况下,您必须访问当前 DbContext实例并在该连接上执行存储过程。强烈建议使用SlqCommandDbCommand
  3. 您正在使用TransactionScope从交易的角度来涵盖所有方案。你没有更多关于这个话题的内容。在某些高级方案中,您必须启用MARS(多个活动结果集)和MSDTC服务。这是来自SO的discussion
  4. 如果您提供更多详细信息或澄清问题,我可以为您提供更具体的帮助/答案。