ASP.NET 6.0에서 Entity Framework 없이 CRUD 작업을 수행하는 OData

이전 자습서에서 우리는 Entity Framework를 사용하는 OData를 보았습니다.
이 자습서에서는 Entity Framework 없이 CRUD 작업을 수행하지 않고 odata 끝점을 노출하는 방법을 설명합니다.

OData는 데이터를 끝점까지 가져오는 기본 개념이 최종 사용자에게 완전히 추상적인 곳에서 데이터를 가져올 수 있는 일련의 데이터 액세스 메커니즘을 허용하는 데이터 원본 또는 끝점입니다.
Entity Framework 및 Odata와 강력한 관계가 없습니다.

준비


  • .NET 6 SDK 설치: ( https://dotnet.microsoft.com/en-us/download/dotnet/6.0 )
  • SQL 설치 및 설정:( https://www.microsoft.com/en-in/sql-server/sql-server-downloads )
  • API 테스트를 위해 Postman 설치:( https://www.postman.com/downloads/ )

  • 프로젝트 만들기


  • 다음 명령을 사용하십시오. dotnet new webapi -o ODataWithoutEf
  • 솔루션 만들기: dotnet new sln
  • 프로젝트와 솔루션 연결: dotnet sln add ODataStudent

  • 종속성 추가


  • OData 설치: Install-Package Microsoft.AspNetCore.OData -버전 8.0.4

  • 프로젝트를 데이터베이스에 연결



    다음 스키마로 데이터베이스를 생성합니다.
    데이터베이스 이름: ODataStudent
    테이블 이름: 학생
    열 이름:


    여기에서 우리가 데이터베이스를 생성한 이전 자습서를 볼 수 있습니다. 이 자습서에서는 동일한 데이터베이스가 사용됩니다.
    Models 폴더를 만듭니다. 같은 폴더에 Student.cs 파일을 만듭니다.

    namespace ODataWithoutEF.Models
    {
        public class Student
        {
            public int Id { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }
    }
    
    


    Models 폴더에서 ContextDb.cs 파일을 만듭니다. 이것은 리포지토리로 작동하며 컨트롤러를 통해 데이터를 제공합니다.

    using System.Data;
    using System.Data.SqlClient;
    
    namespace ODataWithoutEF.Models
    {
        public class ContextDb
        {  
            string conn = "Data Source=(localdb)\\mssqllocaldb; Database=ODataStudent;Trusted_Connection=True;MultipleActiveResultSets=True";
            public List<Student> GetStudent()
            {
                List<Student> list = new List<Student>();
                string query = "Select * from Students";
                using (SqlConnection con = new SqlConnection(conn))
                {
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        SqlDataAdapter adp = new SqlDataAdapter(cmd);
                        DataTable dt = new DataTable();
                        adp.Fill(dt);
                        foreach (DataRow dr in dt.Rows)
                        {
                            list.Add(new Student { Id=Convert.ToInt32(dr[0]), FirstName= Convert.ToString(dr[1]), LastName = Convert.ToString(dr[2]) });
                        }
                    }
                }
                return list;
            }
    
            public bool Add(Student obj)
            {
                string query = "insert into Students values('" + obj.FirstName + "','" + obj.LastName + "')";
                using (SqlConnection con = new SqlConnection(conn))
                {
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        if (con.State == ConnectionState.Closed)
                            con.Open();
                        int i = cmd.ExecuteNonQuery();
                        if (i >= 1)
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
            }
    
            public bool Edit(int id, Student obj)
            {
                string query = "update Students set FirstName= '" + obj.FirstName + "', LastName='" + obj.LastName + "' where Id='" + id + "' ";
                using (SqlConnection con = new SqlConnection(conn))
                {
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        if (con.State == ConnectionState.Closed)
                            con.Open();
                        int i = cmd.ExecuteNonQuery();
                        if (i >= 1)
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
            }
    
            public bool DeleteStudent(int id)
            {
                string query = "delete Students where Id='" + id + "'";
                using (SqlConnection con = new SqlConnection(conn))
                {
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        if (con.State == ConnectionState.Closed)
                            con.Open();
                        int i = cmd.ExecuteNonQuery();
                        if (i >= 1)
                            {
                                return true;
                            }
                            else
                            {
                                return false;
                            }
                    }
                }
            }
        }
    }
    
    
    
    


    API 컨트롤러 만들기



    Controllers 폴더에 StudentsController.cs 파일을 생성합니다.

    using Microsoft.AspNet.OData.Routing;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.OData.Query;
    using Microsoft.AspNetCore.OData.Routing.Controllers;
    using ODataWithoutEF.Models;
    
    // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
    
    namespace ODataWithoutEF.Controllers
    { 
        public class StudentsController : ODataController
        {
            ContextDb db = new ContextDb();
    
            [EnableQuery]
    
            public IEnumerable<Student> Get()
            {
                return db.GetStudent().ToList();
            }
    
            [HttpGet(nameof(GetById))]
            public IEnumerable<Student> GetById(int Id)
            {
                var result = db.GetStudent().Where(model => model.Id == Id);
    
                return result;
            }
    
            public void Post([FromBody] Student obj)
            {
                if (ModelState.IsValid == true)
                {
                    db.Add(obj);
                }
                else
                {
    
                }
            }
    
    
            [HttpPut("{id}")]
            public void Put(int id, [FromBody] Student obj)
            {
                if (ModelState.IsValid == true)
                {
                    db.Edit(id, obj);
                }
            }
    
    
            [HttpDelete("{id}")]
            public void Delete(int id)
            {
                if (ModelState.IsValid == true)
                {
                    db.DeleteStudent(id);
                }
            }
    
        }
    }
    
    


  • Program.cs 파일:GetEdmModel() 함수에서 모델을 등록합니다. 하나의 개체 ODataConventionModelBuilder 클래스를 만들고 등록하기만 하면 됩니다.

  • using Microsoft.AspNetCore.OData;
    using Microsoft.OData.Edm;
    using Microsoft.OData.ModelBuilder;
    using ODataWithoutEF.Models;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    static IEdmModel GetEdmModel()
    {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Student>("Students");
        return builder.GetEdmModel();
    }
    
    builder.Services.AddControllers().AddOData(opt => opt.AddRouteComponents("odata",GetEdmModel()).Select().Filter().Count().SetMaxTop(25));
    
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
    
    


    Postman에서 API 테스트



    ID와 이름으로 학생 가져오기: https://localhost:7275/odata/Emps?$Select=Id,FirstName



    저장소



    여기에서 소스 코드를 확인할 수 있습니다.
    OData-without-Entity-framework

    계속 배우도록!
    감사합니다
    이 글이 도움이 되었기를 바라며, 자유롭게 아이디어를 공유하거나 이 기사에 댓글을 달아주세요. 여러분의 생각이나 질문이 있으면 저에게 알려주세요!

    좋은 웹페이지 즐겨찾기