Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

제임스의 DB를 노코딩 개발로 Import수행

Entity모델 자동생성



모델맵핑

Code Block
languagec#
themeEmacs
        private void CategoryBoardMapping(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<CategoryBoard>().HasNoKey();
            modelBuilder.Entity<CategoryBoard>().ToView(@"tbl_Category_Board", @"dbo");
            modelBuilder.Entity<CategoryBoard>().Property(x => x.CategoryID).HasColumnName(@"CategoryID").HasColumnType(@"int").ValueGeneratedNever().HasPrecision(10, 0);
            modelBuilder.Entity<CategoryBoard>().Property(x => x.BoardNo).HasColumnName(@"BoardNo").HasColumnType(@"bigint").ValueGeneratedNever().HasPrecision(19, 0);
        }
  • 맵핑 규칙및 프라이머리및 외래키등 설정을 보거나 수정할수 있음최초 키규칙(프라이머리/외래키)등이 적용된 코드이며~ 이후 DB가 수정되면 Sync를 맞춰줍니다. 
    • EntityFrameWork를 이용해 Model통해 CUD시 PrimaryKey는 필수입니다. ( 위 와같이 Key가 없을시 Entity 변경불가 ) / Read는 제약상관없이 조회는 가능


Repository 

  • ORM접근 레파지토리를 통해 개발에서 OOP를 이용하여 DB를 빠르게 이용 ( 사용준비끝)
  • 모델은 DTO(POCO)로 정의되어 분리되어있기때문에 , Dapper나 스토어프로시저 기반으로 교체하더라도~ 모델은 그대로 재사용가능


유닛테스트를 통한 개발 가속화

Image Added

  • Repository/Service를 구현하기 전 단계에서 DB Context TEST를 OOP를 통해 할수 있으며  


DB 개발을 가속화하는  유닛테스트 샘플

Code Block
languagec#
themeEmacs
using GouAPI;

using Microsoft.EntityFrameworkCore;

using Xunit.Abstractions;

namespace GouApiTest.EntityTest
{
    public class GouDbContextTest : XUnitTestBase
    {
        private GouDbContext gouDbContext;

        public GouDbContextTest(ITestOutputHelper output) : base(output)
        {
            // DbContextOptions 생성
            var options = new DbContextOptionsBuilder<GouDbContext>()
                .Options;

            // DI를 통해 GouDbContext 인스턴스 생성
            gouDbContext = new GouDbContext(options);
        }

        [Fact]
        public async Task BadgeInsertAreOK()
        {
            gouDbContext.BadgeInfos.Add(new BadgeInfo
            {
                BadgeImageUrl = "https://www.naver.com",
                BadgeName = "sam badge",
                ModAdmin = "sam",
                ModDate = DateTime.Now,
                RegDate = DateTime.Now,
                RegAdmin = "sam",
            });                
            await gouDbContext.SaveChangesAsync();
        }

        [Fact]
        public async Task BadgeSelectAreOK()
        {
            var badgeInfos = await gouDbContext.BadgeInfos.ToListAsync();
            foreach (var badgeInfo in badgeInfos)
            {
                output.WriteLine($"BadgeNo: {badgeInfo.BadgeNo}");
                output.WriteLine($"BadgeImageUrl: {badgeInfo.BadgeImageUrl}");
                output.WriteLine($"BadgeName: {badgeInfo.BadgeName}");
                output.WriteLine($"RegDate: {badgeInfo.RegDate}");
                output.WriteLine($"RegAdmin: {badgeInfo.RegAdmin}");
                output.WriteLine($"ModDate: {badgeInfo.ModDate}");
                output.WriteLine($"ModAdmin: {badgeInfo.ModAdmin}");
            }
        }

    }
}