King of Stock
C# EntityFramework 설정 본문
사전 환경
- 로컬 환경에 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) } } } }
'IT 기술' 카테고리의 다른 글
리눅스(Debian) 로케일 설정 (0) | 2022.10.14 |
---|---|
Subclassing enum.Enum in python (0) | 2022.03.06 |
VSCode diff 툴 (0) | 2020.08.25 |
[DNS] ubuntu server 18.04 DNS 서버 구성해보기 (0) | 2019.12.21 |
[shell] if문에서 문자열 비교가 안될때 (0) | 2019.12.05 |
Comments