King of Stock

C# EntityFramework 설정 본문

IT 기술

C# EntityFramework 설정

king of stock 2021. 2. 28. 10:23

사전 환경

  • 로컬 환경에 SQL 서버 설치
  • NuGet 패키지 관리자를 통한 EntityFramework 설치(6.4.4)
  • 적절한 IDE(필자는 visual studio 2019 community)

프로젝트 설정

  • app.config

    아래 설정은 필자의 winform 프로젝트에 app.config 파일에 EntityFramework 설정과 관련된 일부분이다. name 부분은 코드에서 사용해야 하는 명칭이고, connectionString 부분은 기존에 SQL Server 연결에 사용하는 문자열이다.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <!-- 중략 -->
        <connectionStrings>
            <add name="smartkuk"
                 providerName="System.Data.SqlClient"
                 connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=smartkuk;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;Min Pool Size=20;Pooling=True;MultipleActiveResultSets=True;Database=smartkuk" />
            <add name="smartkuk_test"
                 providerName="System.Data.SqlClient"
                 connectionString="Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;Pooling=False;MultipleActiveResultSets=True;Database=smartkuk_test" />
        </connectionStrings>
        <!-- 중략 -->
    </configuration>

    위에는 2개의 설정이 있으며, 하나는 테스트 케이스에 사용하고 다른 하나는 애플리케이션 기동에 사용한다.

  • SmartkukContext.cs

    app.config 파일에 설정한 내용을 기준으로 데이터베이스에 연결을 하는 클래스이다. EntityFramework의 DbContext 클래스를 상속하여 이용해야 한다. 테스트를 위한 명칭이 입력된다면 DropCreateDatabaseAlways 전략을 사용해서 테이블을 지우고 생성하도록 유도했다.

    using System.Data.Entity;
    
    using log4net;
    
    using Smartkuk.models.entities;
    using Smartkuk.repositories;
    
    namespace Smartkuk.context
    {
        /// <summary>
        /// EntityFramework 사용하는 데이터베이스 컨텍스트
        /// </summary>
        public class SmartkukContext : DbContext
        {
            private static readonly ILog log = LogManager.GetLogger(typeof(SmartkukContext));
            /// <summary>
            /// 기본 데이터베이스 이름
            /// </summary>
            private static readonly string _database = "smartkuk";
            /// <summary>
            /// 지정한 이름으로 데이터베이스 컨텍스트 생성
            /// </summary>
            public SmartkukContext(string database) : base($"name={database}")
            {
                log.Info($"creating SmartkukContext {database}");
                if ("smartkuk_test".Equals(database))
                {
                    log.Info("Use DropCreateDatabaseAlways strategy on testing.");
                    Database.SetInitializer(new DropCreateDatabaseAlways<SmartkukContext>());
                }
            }
            /// <summary>
            /// 기본 데이터베이스("smartkuk") 컨텍스트 생성
            /// </summary>
            public SmartkukContext() : base($"name={_database}")
            {
                log.Info($"creating SmartkukContext {_database}");
            }
    
            /// <summary>
            /// 사용자
            /// </summary>
            public DbSet<User> User { get; set; }
        }
    }
    
  • User.cs

    아래는 사용자 모델을 나타내는 클래스이고 테이블 이름을 지정 할 수 있고, 생략하면 namespace 와 클래스 이름 등이 합쳐져서 자동 생성된다. PK를 Key 라는 Attribute로 지정했고, 복합키의 경우에는 Order 만 증가해서 Attribute를 추가해주면 된다.

    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace Smartkuk.models.entities
    {
        /// <summary>
        /// 사용자
        /// </summary>
        [Table("user")]
        [ToString]
        public class User
        {
            /// <summary>
            /// 일련번호
            /// </summary>
            [Key, Column(Order = 0)]
            public int Seq { get; set; }
            /// <summary>
            /// 이름
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 나이
            /// </summary>
            public int Age { get; set; }
        }
    }
    

    위에 ToString 은 ToString.Fody NuGet 패키지 관리자를 통해서 설치하여 사용 가능한 Attribute 이다.

  • UserTests.cs

    테스트 케이스를 다음과 같이 만들어서 확인할 수 있다. 환경변수(TEST_DATABASE)에 smartkuk_test 셋팅하고 아래를 실행했다.

    using log4net;
    
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    using Smartkuk.models.entities;
    
    namespace SmartkukTest.models.entity
    {
        [TestClass]
        public class UserTests
        {
            [TestMethod]
            public void SaveAndFindTest()
            {
                using (var ctx = new SmartkukContext(Environment.GetEnvironmentVariable("TEST_DATABASE")))
                {
                    var user = new User
                    {
                        Name = "smartkuk",
                        Age = 10
                    };
    
                    ctx.User.Add(user);
                    ctx.SaveChanges();
    
                    var entity = ctx.User.Find(date, account);
                    Assert.AreEqual(user.Name, entity.Name);
                    Assert.AreEqual(user.Age, entity.Age);
                    Assert.IsTrue(user.Seq >= 0)
                }
            }
        }
    }
Comments