>

예를 들어, 다음과 같은 Laravel Resource Controller 코드가 있습니다 :

class BaseAPIController extends Controller
{
    public function index()
    {
        return self::$model->all();
    }
}

그래서 ASP.NET C #에서 그렇게하려고 노력했습니다 :

[ApiController]
public class BaseAPIController<T> : ControllerBase
{
    [HttpGet]
    public ActionResult<IEnumerable<T>> Get()
    {
        using (ExamRTContext db = new ExamRTContext())
        {
            return db.${typeof(T).Name}.Select(x => x);
        }
    }
}

하지만 어떻게해야할지 모르겠습니다.

그래서 3 개의 테이블로 간단한 CRUD를하고 싶다고합시다. 모든 작업은 동일합니다. 예를 들어 Get ()은 해당 모델에서 모든 데이터를 가져 오는 데 사용됩니다.

3 번 쓰는 대신 한 번만 쓰고 각 모델 컨트롤러로 확장하고 싶었습니다.

어떻게해야할까요?


  • 답변 # 1

    C #에서는 런타임에 식을 작성할 수 없습니다.

    그러나 EF는이를위한 API를 가지고 있습니다.
    당신을 찾고 있습니다 .Set<T>() .

  • 답변 # 2

    엔터티 프레임 워크로 간단한 CRUD 작업을 수행하려면 일반 리포지토리를 만들 수 있습니다.

    저장소 :

       public class GenericRepository<TEntity, TContext>
            where TContext : DbContext
            where TEntity : class
        {
            protected readonly TContext context;
            public GenericRepository(TContext context)
            {
                this.context = context;
            }
            public virtual async Task Add(TEntity model)
            {
                await context.Set<TEntity>().AddAsync(model);
                await context.SaveChangesAsync();
            }
            public virtual async Task<TEntity> Get(int id)
            {
                return await context.Set<TEntity>().FindAsync(id);
            }
            public virtual async Task<IEnumerable<TEntity>> GetAll()
            {
                return await context.Set<TEntity>().ToListAsync();
            }
            public virtual async Task<TEntity> FindFirstBy(Func<TEntity,bool> predicate)
            {
                return await Task.Run(()=> context.Set<TEntity>().FirstOrDefault(predicate));
            }
            public virtual async Task<IEnumerable<TEntity>> FilterBy(Func<TEntity,bool> predicate)
            {
                return await Task.Run(()=> context.Set<TEntity>().Where(predicate).ToList());
            }
            public virtual async Task Update()
            {
                await context.SaveChangesAsync();
            }
            public virtual async Task Remove(TEntity model)
            {
                context.Set<TEntity>().Remove(model);
                await context.SaveChangesAsync();
            }
        }
    
    

    사용하려면 엔티티 유형과 컨텍스트를 지정하여 컨트롤러에 삽입하면됩니다. 예를 들면 다음과 같습니다.

    컨트롤러 기반 :

    [ApiController]
    public class BaseAPIController<T> : ControllerBase
    {
        protected readonly GenericReposoitory<T,ExamRTContext> repository;
        public BaseAPIController(GenericRepository<T,ExamRTContext> repository) {
            this.repository = repository;
        }
        [HttpGet]
        public ActionResult<IEnumerable<T>> Get()
        {
            var entities = repository.GetAll();
            if (entities!= null) {
                return Ok(entities);
            }
            return NotFound();
        }
    }
    
    

    시작시 :

    services.AddTransient(typeof(GenericRepository<,>), typeof(GenericRepository<,>));
    
    

관련 자료

  • 이전 ruby on rails - "날짜 관련"을 기준으로 정렬하는 방법은 무엇입니까?
  • 다음 reactjs - 반응 테이블에 대소 문자를 구분하지 않는 정렬을 추가하는 방법은 무엇입니까?