4 min read

Entity Framework Core 3.1 ile API yazımı

Bu yazıda EF Core 3.1 ve MySql veritabanı ile Places adlı bir REST API yazıyoruz.
Entity Framework Core 3.1 ile API yazımı

Malum koronavirüs salgınından dolayı seyahat etmek, yeni mekanlar gezmek şimdilik hayal olmuş durumda. Ama ümidi kesmemek lazım. Salgın bittiğinde gezilecek çok yer, yapılacak çok şey olacak. Bu amaçla gezip görmeye değer mekanların bilgisini tutan bir veritabanı oluşturarak bunu bir API üzerinden erişime açabiliriz.

Bu yazıda EF Core 3.1 ve MySql veritabanı ile Places adlı bir API yazacağız. Bu API kullanıcılarına çeşitli mekanlar ekleme, listeleme, filtreleme ve düzenleme imkanı sağlayacak.

Projenin kaynak kodlarını Github'dan indirip inceleyebilirsiniz.

gulangurman/PlacesAPI
ASP.NET Core WebAPI with Entity Framework 3.1 and MySql - gulangurman/PlacesAPI

1.Projeyi oluşturalım

2.Modeli tanımlayalım

Places API kısaca bir mekan sözlüğüdür diyebiliriz.

Place sınıfının UMLmodeli

Place adı verdiğimiz "mekan" modelinde Id ile numarası, Name ile mekanın adı, Tags ile mekana verilen etiketler, IsOpen ile de açık olup olmaması ifade ediliyor.

public class Place
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Tags { get; set; }
        public bool IsOpen { get; set; }
        public string Details { get; set; }
    }

Details alanı ekstra detay bilgileri içeriyor, fakat bu alanın API ile okunup yazılmasını istemiyoruz. Bu yüzden bu alanın olmadığı bir DTO yazarak sadece istediğimiz alanları API'ye açmış oluyoruz.

public class PlaceDTO
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Tags { get; set; }
        public bool IsOpen { get; set; }
    }

3.Veritabanını belirtelim

Startup sınıfında MySql veritabanı bağlantısını tanıtalım. appsettings.json dosyasına kendi bağlantı cümlenizi yazabilirsiniz.

Not: Burada EFCore ile mysql kullanabilmek için Pomelo.EntityFrameworkCore.MySql (3.2.4) paketini kullanıyoruz.

4.Veritabanı context'i ile tablomuzu tanımlayalım

Mekanları Entity Framework Core ile yönetiyoruz. Bunun için bir DbContext türevi yazarak mekanları ifade eden bir DbSet ekliyoruz.

public class PlaceContext : DbContext
    {
        public PlaceContext(DbContextOptions<PlaceContext> options)
            : base(options)
        {
        }

        public DbSet<Place> Places { get; set; }
    }

Veritabanında migration yapalım:

Add-Migration DbInit
Update-Database

Bu aşamada EF Core ile veritabanı işlemlerine hazırız demektir.

5.Controller ile REST metotlarını yazalım

API ile mekanlara erişebilmek için bir controller yazıyoruz. Tipik HTTP GET, POST, PUT, DELETE metotları ekliyoruz.

[Route("api/[controller]")]
    [ApiController]
    public class PlacesController : ControllerBase
    {
        private readonly PlaceContext _context;

        public PlacesController(PlaceContext context)
        {
            _context = context;
        }

        // GET: api/Places
        [HttpGet]
        public async Task<ActionResult<IEnumerable<PlaceDTO>>> GetPlaces()
        {
            return await _context.Places.Select(x=>PlaceToDTO(x)).ToListAsync();
        }

        // GET: api/Places/5
        [HttpGet("{id}")]
        public async Task<ActionResult<PlaceDTO>> GetPlace(long id)
        {
            var place = await _context.Places.FindAsync(id);

            if (place == null)
            {
                return NotFound();
            }

            return PlaceToDTO(place);
        }

        // PUT: api/Places/5
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPut("{id}")]
        public async Task<IActionResult> UpdatePlace(long id, PlaceDTO placeDTO)
        {
            if (id != placeDTO.Id)
            {
                return BadRequest();
            }
            var place = await _context.Places.FindAsync(id);
            if (place == null)
            {
                return NotFound();
            }
            place.Name = placeDTO.Name;
            place.IsOpen = placeDTO.IsOpen;
            place.Tags = placeDTO.Tags;           

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException) when (!PlaceExists(id))
            {
                return NotFound();               
            }

            return NoContent();
        }

        // POST: api/Places
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPost]
        public async Task<ActionResult<PlaceDTO>> CreatePlace(PlaceDTO placeDTO)
        {
            var place = new Place
            {
                IsOpen = placeDTO.IsOpen,
                Name = placeDTO.Name,
                Tags = placeDTO.Tags
            };
            _context.Places.Add(place);
            await _context.SaveChangesAsync();

            return CreatedAtAction(nameof(GetPlace), new { id = place.Id }, PlaceToDTO(place));
        }

        // DELETE: api/Places/5
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeletePlace(long id)
        {
            var place = await _context.Places.FindAsync(id);
            if (place == null)
            {
                return NotFound();
            }

            _context.Places.Remove(place);
            await _context.SaveChangesAsync();

            return NoContent();
        }

        private bool PlaceExists(long id)
        {
            return _context.Places.Any(e => e.Id == id);
        }
        private static PlaceDTO PlaceToDTO(Place place) =>
            new PlaceDTO
            {
                Id = place.Id,
                Name = place.Name,
                IsOpen = place.IsOpen,
                Tags = place.Tags
            };
    }

6.Çalıştıralım

API çalıştırdığımızda veritabanı henüz boş olduğundan GET isteği boş bir dizi döndürecektir.

Postman ile bir mekan eklemeyi deneyelim.

İlk mekan başarıyla eklendi. Bir mekan daha girelim:

Şu anda veritabanında iki mekan bulunuyor.

Bir de mekanların tümünü isteyelim.

Sonuç olarak iki mekanı da listede görebiliyoruz.

Veritabanını incelediğimiz zaman:

Son söz.

Bu yazıda Entity Framework Core 3.1 ile MySql veritabanı kullanan bir API yazdık. Bu yazının kaynak kodlarında bulunan Postman koleksiyonundaki HTTP istekleri ile API'nin doğru çalıştığını gözlemledik. Siz de bu koleksiyonu kullanarak çeşitli işlemleri deneyebilir, proje üzerinde değişik senaryolar üreterek API'yi geliştirebilirsiniz. Bir sonraki yazıda görüşmek üzere, hoşçakalın.