0

aspnetboilerplate 템플릿을 사용하고 있습니다.Aspnet 보일러 플레이트를 사용하여 Entity Framework에서 저장 프로 시저 호출

학생 서비스 클래스가 있습니다. 나는 학생 프로필 목록을 저장 프로 시저에서 가져옵니다. 내가 aspnetboilerplate 템플릿

public class StudentRepository : TabonoRepositoryBase<User, long> 
    { 
     private readonly IActiveTransactionProvider _transactionProvider; 

     public StudentRepository(IDbContextProvider<TabonoDbContext> dbContextProvider, IActiveTransactionProvider transactionProvider) 
      : base(dbContextProvider) 
     { 
      _transactionProvider = transactionProvider; 
     } 

     //TODO: Make async! 
     public async Task<int> GetProfileCompletePercentage(int studentid) 
     { 
      EnsureConnectionOpen(); 

      using (var command = CreateCommand("Sp_GetStudentprofilepercentage", CommandType.StoredProcedure, new SqlParameter("StudentId", studentid))) 
      { 
       using (var dataReader = await command.ExecuteReaderAsync()) 
       { 
        while (dataReader.Read()) 
        { 
         return Convert.ToInt16(dataReader["TotalPer"].ToString()); 
        } 
        return 0; 
       } 
      } 
     } 

     private DbCommand CreateCommand(string commandText, CommandType commandType, params SqlParameter[] parameters) 
     { 
      var command = Context.Database.GetDbConnection().CreateCommand(); 

      command.CommandText = commandText; 
      command.CommandType = commandType; 
      command.Transaction = GetActiveTransaction(); 

      foreach (var parameter in parameters) 
      { 
       command.Parameters.Add(parameter); 
      } 

      return command; 
     } 

     private void EnsureConnectionOpen() 
     { 
      var connection = Context.Database.GetDbConnection(); 

      if (connection.State != ConnectionState.Open) 
      { 
       connection.Open(); 
      } 
     } 

     private DbTransaction GetActiveTransaction() 
     { 
      return (DbTransaction)_transactionProvider.GetActiveTransaction(new ActiveTransactionProviderArgs 
      { 
       {"ContextType", typeof(TabonoDbContext) }, 
       {"MultiTenancySide", MultiTenancySide } 
      }); 
     } 
    } 

에서 저장 프로 시저를 호출하고이 서비스 클래스

public class StudentService : AsyncCrudAppService<StudentCore, StudentDto, int, PagedResultRequestDto, StudentCreateDto, StudentUpdateDto>, IStudentService 
    { 
     public readonly IRepository<StudentCore> _studentRepository; 
     private readonly UserManager _userManager; 
     private readonly IStudentService _studentservice; 

     public StudentService(IRepository<StudentCore> repository, UserManager um, IStudentService studentservice) : base(repository) 
     { 
      _studentRepository = repository; 
      _userManager = um; 
      _studentservice = studentservice; 
     } 
public Task GetProfileCompletePercentage(int studentid) 
     { 
      return _studentservice.GetProfileCompletePercentage(studentid); 
     } 
    } 

답변

2

인터페이스 만들기입니다 방법 :

:

public interface IStudentRepository : IRepository<StudentCore> 
{ 
    Task<int> GetProfileCompletePercentage(int studentid); 
} 

이 인터페이스를 구현을

public class StudentRepository : TabonoRepositoryBase<StudentCore>, IStudentRepository 
{ 
    // ... 
} 

인터페이스를 주입하고 메소드를 호출

public class StudentService : ... 
{ 
    private readonly IStudentRepository _studentRepository; 

    public StudentService(IStudentRepository repository) : base(repository) 
    { 
     _studentRepository = repository; 
    } 

    public Task GetProfileCompletePercentage(int studentid) 
    { 
     return _studentRepository.GetProfileCompletePercentage(studentid); 
    } 
} 

참고 : StudentService는 무한 재귀 → 생성자에서 IStudentService를 주입하지 않아야합니다! 참고로

: 무한 재귀 → 생성자에서 IStudentService를 주입해서는 안 https://www.codeproject.com/Articles/1199648/Using-Stored-Procedure-User-Defined-Function-and-V

+0

StudentService! 예 그걸 제거하는 것을 잊었습니다 – Nighil

+0

하나의 의심 나는 entityframework처럼 사용하고 전화 할 수 – Nighil

+0

이렇게? var courseList = ctx.Database.SqlQuery ("exec GetCoursesByStudentId @StudentId", idParam) .ToList (); – Nighil