개발 이야기/ORM2012. 4. 15. 12:30

Entity Framework - Entity CRUD

이번에 알아 볼 내용은 Entity Framework의 실지적인 Entity CRUD입니다저희가 데이터를 가져와서 데이터를 생성하고 조회하고 수정하고 삭제하고!!!! 개발에 필수적으로 필요한 작업인데요이번에 엔티티를 가지고 와서 작업을 해보는 것을 살펴보겠습니다.

 

Entity 조회(Select)

엔티티 조회하는 것은 이미 앞 세션에서 설명을 들였습니다반복학습이 될거라 생각됩니다우선Northwind 데이터베이스를 연결하겠습니다.

06_01.jpg

[그림 6-1] DB 연결

 

저희가 간단히 CRUD기능을 살펴볼 예정이니 테이블 하나만 선택하겠습니다. Shippers 테이블을 선택해주세요!

06_02.jpg

[그림 6-2] 테이블 선택

 

자 엔티티를 가져왔다면 데이터를 조회하는 코드를 작성해보겠습니다개체 컨텍스트를 가져와서 그리드뷰에 뿌려줍니다컨텍스트에서 Shippers 엔티티를 조회하면 됩니다코딩은 간단하죠?

 

        private void btnSelect_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                dataGridView1.DataSource = context.Shippers;

            }            

        }

 

 

06_03.jpg

[그림 6-3] 조회화면


Entity 수정(Update)

다음은 엔티티 수정입니다수정하려는 데이터를 조회해서 해당 엔티티 속성들 값을 수정합니다수정 후에 데이터베이스에 반영이 되려면 최종적으로 SaveChanges 메서드를 호출해줘야 합니다. SaveChanges는 데이터 소스인 데이터베이스와 엔티티 컨텍스트 사이에서 모든 업데이트 내용을 유지하면 추적 기능을 제공하고 있습니다.

 

        private void btnUpdate_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                var shipper = context.Shippers.Where(p => p.ShipperID == 1).First();

                shipper.CompanyName = shipper.CompanyName + "_Modify";

                shipper.Phone = "(503) 555-9839";

                context.SaveChanges();

 

                dataGridView1.DataSource = context.Shippers;

            }

        }

 

 

06_04.jpg

[그림 6-4] 수정버튼 후 화면

 

Entity 추가(Insert)

엔티티 추가입니다. Shippers 엔티티 구조를 먼저 살펴보겠습니다. ShipperID 컬럼이 자동 증가입니다데이터 추가시에는CompanyName, Phone 컬럼의 데이터만 매핑해주면 됩니다.

CREATE TABLE [dbo].[Shippers](

       [ShipperID] [int] IDENTITY(1,1) NOT NULL,

       [CompanyName] [nvarchar](40) NOT NULL,

       [Phone] [nvarchar](24) NULL,

 CONSTRAINT [PK_Shippers] PRIMARY KEY CLUSTERED

(

       [ShipperID] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

 

GO

 

Shippers 객체를 하나 생성해서 데이터를 매핑해줍니다컨텍스트 AddObject메서드를 통해서 Shippers 엔티티 데이터를 생성합니다데이터베이스 반영을 위해서는 SaveChanges 메서드를 꼭 출해줘야 합니다.!

 

        private void btnCreate_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                Shippers addEntity = new Shippers();

                addEntity.CompanyName = "jiseon Company2;

                addEntity.Phone = "(02) 111-9999";

                context.Shippers.AddObject(addEntity);

                context.SaveChanges();

 

                dataGridView1.DataSource = context.Shippers;

            }

        }

 

 

06_05.jpg

[그림 6-5] 엔티티 생성 후 화면

 

Entity 삭제(Delete)

마지막으로 엔티티 삭제입니다.^^ 엔티티 수정과 마찬가지로 특정 데이터를 조회해서 컨텍스트DeleteObject에 삭제 엔티티를 할당합니다. SaveChanges 메서드를 호출하면 실제 데이터베이스에서 해당 데이터가 삭제됩니다.

 

        private void btnDelete_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                var shipper = context.Shippers.Where(p => p.ShipperID == 6).First();

                context.DeleteObject(shipper);

                context.SaveChanges();

 

                dataGridView1.DataSource = context.Shippers;

            }

        }

 

 

06_06.jpg

[그림 6-6] 삭제 후 화면

 

엔티티를 조회하고 수정신규생성삭제하는 것을 살펴보았습니다생각보다 코드는 간단했지요~ 단순 조회성이 아닌 비지니스 로직이 추가되는 작업일 경우에는 꼭 SaveChanges 메서드를 호출해줘야 데이터베이스에 반영이 된다는 것만 잊지않으면 됩니다.! 감사합니다.^^

소스 파일 : EF4.06.zip


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/400541

Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:29

Entity Framework Context

이전 세션에서 Database에서 개체들을 Entity화하는 부분을 확인해보았습니다이번 시간은 이 엔티티를 가지고 실제 컨트롤에 데이터를 바인딩하는 부분을 살펴보겠습니다.

 

실전따라해보기!!

EDM 항목을 하나 추가해주세요.

01.JPG

[그림5-1] EDM 항목 추가

 

데이터베이스를 연결해주세요저는 기본인 Northwind를 연결하겠습니다.

02.JPG

[그림5-2] EDM Database연결

 

모델 네이스페이스를 지정해주시고요.

03.JPG

[그림5-3] Database 개체 선택

 

EDM이 자동생성 된것을 확인하셨죠?! 모델 브라우저에서 다음과 같이 NorthwindEntities가 생성된 것이 보입니다. EntityContainer EntityFramework ObjectContext 클래스를 상속합니다. ObjectContext은 정의된 EDM 엔티티 형식의 객체들의 데이터를 관리하는 기본 클래스입니다.^^

04.JPG

[그림5-4] 모델 브라우저

 

데이터를 뿌려줄 UI를 간단히 구성해보겠습니다버튼과 리트스박스로 구성되었으며 버튼을 클릭하면 리스트박스에 데이터를 바인딩하려합니다.

05.JPG

[그림5-5] UI 구성

 

버튼 클릭 시 소스 코드는 다음과 같습니다앞에서 언급한 LINQ Object를 질의하시면 됩니다. NorthwindEntities Customers엔티티를 가져와서 실제 데이터베이스 데이터를 바인딩하겠습니다조건에 맞는 데이터를 가져와야한다면 var customer = context.Customers; è 에서 조건 질의 하면된다.

 

        private void button1_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                var customer = context.Customers;

                foreach (var item in customer)

                {

                    listBox1.Items.Add(string.Format("{0} | {1}", item.CompanyName, item.City));

                }

            }

        }

 

 

프로그램을 실행해서 버튼을 클릭해보겠습니다다음과 같이 목록이 주루륵조회되는 것을 보실 수 있습니다.

07.JPG

[그림5-6] UI Data Bind

 

디버깅으로 Customers를 확인해보면 ObjectSet객체가 반환되는 것을 확인 할 수 있습니다이렇게 EDM에서 엔티티들을ObjectSet으로 구성하는 것을 확인 하였습니다.

06.JPG

[그림5-7] ObjectSet

 

EDM 코드를 한번 더 살펴보죠. ObjectSet으로 다음과 같이 반환을 하고 있습니다.

 

        /// <summary>

        /// No Metadata Documentation available.

        /// </summary>

        public ObjectSet<Customers> Customers

        {

            get

            {

                if ((_Customers == null))

                {

                    _Customers = base.CreateObjectSet<Customers>("Customers");

                }

                return _Customers;

            }

        }

        private ObjectSet<Customers> _Customers;

   

 

 

추가 팁!

SQL Server에서는 논리적으로 다음과 같은 순서로 질의합니다.

(8) SELECT (9) TOP

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) WITH

(7) HAVING

(1) ORDER BY

 

이번 세션은 이렇게 마무리 짓겠습니다.^^ 다음 세션은 이번 세션의 확장으로 실제 Entity들의 작업에 대해서 알아보겠습니다행복한 하루 보내세요!

소스파일 : EF4.05.zip


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/396913


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:29

Database-First VS Model-First

이번에 알아 볼 내용은 EDM(Entity Data Model)입니다. Entity Framework 4.0 기능에서 Model-First 지원이 있었는데요기존 버전과의 차이와 해당 기능에 대해서 자세히 살펴보는 시간이 되겠습니다이제 떠나보지요~~~ 후훗

 

Database-First

이전 버전의 방식으로 데이터베이스 개체들을 엔티티화하는 것으로 실제로 존재하는 개체들 즉, Database 기반의 데이터 모델이라고 보시면 됩니다. Visual Studio에서 간단한 프로젝트를 생성하시고 프로젝트에서 Item 항목을 추가해보겠습니다. Item에서"ADO.NET Entity Data Model"을 선택해주세요.

 

4_1.JPG

[그림 4-1] 항목 선택

 

추가하면 다음과 같은 화면이 나오는데 “Next”를 클릭합니다.

 4_2.JPG

[그림 4-2] EDM 마법사

 

연결정보를 선택하고 App.Config에 들어가는 연결명을 기입해주세요Default 값을 사용하셔도 됩니다. ConnectionString 설정 값입니다.

 4_3.JPG

[그림 4-3] 데이터베이스 연결 설정

 

가져올 데이터베이스 개체들을 선택하시고 모델 네임스페이스명을 기입해주세요그리고 완료!!

 4_4.JPG

[그림 4-4] 개체 선택

 

보시다시피 데이터베이스 개체들 기준의 엔티티들이 자동으로 생성되었습니다야호!!!!!!

 4_5.JPG

[그림 4-5] EDM

 

엔티티를 하나 선택하시고 마우스 오른쪽버튼을 클릭해서 “Table Mapping” 메뉴를 선택하시면 엔티티 상세정보가 출력됩니다.엔티티와 실제 DB 개체관의 관계도 표현이 되고요^^

 4_6.JPG

[그림 4-6] 테이블 매핑

 

추가로 View 메뉴에서  “Entity Data Model Browser”를 클릭하면 모델의 엔티티들을 볼 수 있다.

 4_8.JPG

[그림 4-7]  > EDM 브라우저

 

엔티티는 모델에 정의된 객체들입니다연계(Association)는 두 엔티티간의 관계입니다. EDMX의 객체들이 트리뷰로 출력됩니다.

 4_9.JPG

[그림 4-8] Entity Data Model Browser

지금까지 데이터베이스 기준의 모델을 생성하는 것을 확인하였습니다물리적 개체에서 논리적 모델로 표현되는 것입니다이를Database-First라고 합니다.

 

 

Model-First

다음은 모델 우선입니다ㅋㅋ 해석하니 모델 우선인데 좀 웃기네요데이터 모델링을 해보셨다면 아시겠지만 보통 개념모델 è논리모델 è 물리모델 순으로 진행됩니다이전 버전의 엔티티 프레임워크는 어쩜 거꾸로였죠ㅋ 엔티티 프레임워크 4.0에서는 개념 모델링 후 저장소에 개체들을 생성할 수 있는 기능이 추가되었다또 시작해보죠!

“ADO.NET Entity Data Model” 항목을 추가해주세요

 4_10.JPG

[그림 4-9] 항목 선택

 

빈 모델을 선택하고 완료버튼 클릭!

 4_11.JPG

[그림 4-10] EDM 마법사

 

다음 화면처럼 빈화면이 나옵니다. Toolbar를 보면 엔티티를 그릴 수 있는 도구들이 있는데요위부분에서 언급했지만 한번 더엔티티는 모델에 정의된 객체들이고 연계(Association)는 두 엔티티간의 관계입니다상속(Inheritance)은 두 엔티티간의 상속관계를 표현할 경우 사용됩니다.

 4_12.JPG

[그림 4-11] 빈 모델

 

도구들을 이용해서 엔티티 하나를 그려보겠습니다엔티티를 그리고 마우스 오른쪽을 클릭해서 속성 하나를 추가해보겠습니다.

 4_13.JPG

[그림 4-12] 엔티티 속성 추가

 

모델링 된 엔티티를 데이터 저장소에 생성해보겠습니다마찬가지로 마우스 오른쪽을 클릭해서 “Generate Database from Model…”을 선택하면

 4_14.JPG

[그림 4-13] 모델 자동 생성

 

데이터 저장소를 설정하는 화면이 출력됩니다적당한 값을 선택하고 “Next”을 클릭해주세요.

 4_15.JPG

[그림 4-14] 데이터베이스 연결 설정

 

데이터베이스 개체 구조를 정의한 DDL(Data Definition Language)이 생성됩니다.

 4_16.JPG

[그림 4-15] DDL 생성

 

완료를 클릭하면 스크립트가 화면에 출력됩니다.

 4_17.JPG

[그림 4-16] 스크립트

 

SQL 스크립트를 실행해보겠습니다.

 4_18.JPG

[그림 4-17] 스크립트 실행

 

아래 메세지 보니 성공적으로 완료되었네요^^ 실제로 생성되었는지 데이터베이스를 확인해보겠습니다.

 4_19.JPG

[그림 4-18] 스크립트 실행 결과

 

오호생성되었네요~

 4_20.JPG

[그림 4-19] 데이터베이스

개념 모델 이후에 저장소에 개체를 생성하는 방법을 Model-First이라고 합니다.

 

오늘은 이렇게 Database-First Model-First에 대해서 알아봤습니다.^^ 긴 글 끝까지 읽어주셔서 감사합니다



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/391510


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:28

LINQ 알고가자

엔티티 프레임워크에서는 엔티티를 질의하는데 LINQ문을 사용합니다하여 이번에는 LINQ의 기본적인 사용법에 대해서 알아보자.

 

LINQ?

LINQ(Language Integrated Query )는 통합언어 쿼리로 .NET Framework 3.5에 포함되었다. LINQ to Object, LINQ to SQL, LINQ to XML로 크게 나눌 수 있는데 이는 데이터베이스, XML 등등 개체화하는 데이터 소스에 대해서 전반적으로 쉽게 질의 할 수 있게 제공한다.

3_1.jpg

[그림 3-1] .NET LINQ

이번 세션의 목표는 LINQ 문법을 익히는데 중점을 두며 아래 URL에 가면 LINQ 샘플을 다운로드 받아 볼 수 있는데 샘플을 기준으로 각각의 표현식을 설명하려합니다부족한 부분은 샘플을 다운받아서 한번씩 살펴보시기 바랍니다.
LINQ 샘플 다운로드 URL - http://msdn.microsoft.com/ko-kr/vcsharp/aa336746.aspx

LINQ는 쿼리 표현식과 람다식 함수로 나눠 작성할 수 있습니다예제는 주로 쿼리 표현식으로 작성하겠습니다더 람다식에 대해 더 자세히 공부하고 싶으신 분은 아래 링크를 참고하세요.
람다 식(C# 프로그래밍 가이드) - http://msdn.microsoft.com/ko-kr/library/bb397687.aspx

 

기본 표현식

Select
기본 데이터소스에서 특정 개체를 조회해오는 구문입니다구문 작성은 SQL구문과 비슷해서 쉽게 익힐 수 있다.

 

        public static void Select1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

 

            var numsPlusOne = from n in numbers

                              select n + 1;

 

            Console.WriteLine("Numbers + 1:");

            foreach (var i in numsPlusOne)

            {

                Console.WriteLine(i);

            }

        }

    }

 

3_2.jpg

[그림 3-2] Select 실행 결과

Where

해당 조건에 맞는 데이터를 조회할 경우 사용한다.

 

        public static void Where1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

 

            var lowNums = from n in numbers

                          where n < 5

                          select n;

 

            Console.WriteLine("Numbers < 5:");

            foreach (var x in lowNums)

            {

                Console.WriteLine(x);

            }

        }

 

3_3.jpg

[그림 3-3] Where 실행 결과

LINQ는 지연된 쿼리라는 특성을 가지고 있습니다이는 데이터 조건이 실행되어 결과 집합으로 가지고 있는것이 아니라 조건을 출력하는 시점에서 실행이 되는 것을 뜻합니다즉 위의 표현식에서 살펴보면 실제로 위에 해당되는 쿼리가 실행되는 시점은 출력을 요청하는 foreach 구문 내부입니다이를 지연된 쿼리라고 불리며 개발자의 설정에 따라 즉시실행을 할 수도 있습니다.

OrderBy

데이터 정렬하는 표현식입니다.

 

        public static void OrderBy1()

        {

            string[] words = { "cherry""apple""blueberry" };

 

            var sortedWords = from w in words

                              orderby w

                              select w;

 

            Console.WriteLine("The sorted list of words:");

            foreach (var w in sortedWords)

            {

                Console.WriteLine(w);

            }

        }

 

3_4.jpg

[그림 3-4] OrderBy 실행 결과

역정렬을 원하는 경우 descending” 구문만 추가해주면 됩니다.^^

 

            var sortedDoubles = from d in doubles

                                orderby d descending

                                select d;

 

 

집계 표현식

LINQ는 집계 연산을 수행하는 함수를 기본적으로 제공합니다기본함수에는 Count, Sum, Min/Max, Average, Aggregate 등등이 있다대표해서 몇가지만 알아보자.

Count

조회된 데이터의 Row수를 리턴합니다. LINQ는 기본적인 메서드를 제공하는데 Count 메서드만 호출하면 조회된 결과의 개수를 반환합니다. Count2 메서드는 조건에 해당하는 결과만 반환하게 됩니다.

 

        public void Count1()

        {

            int[] factorsOf300 = { 2, 2, 3, 5, 5 };

            int uniqueFactors = factorsOf300.Distinct().Count();

            Console.WriteLine("There are {0} unique factors of 300.", uniqueFactors);

        }

 

        public void Count2()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            int oddNumbers = numbers.Count(n => n % 2 == 1);

            Console.WriteLine("There are {0} odd numbers in the list.", oddNumbers);

        }

 

3_5.jpg

[그림 3-5] Count 실행 결과

Sum

Sum은 집합의 합계를 반환합니다. Count와 동일하게 Sum 메서드만 호출하면 됩니다.

 

        public void Sum1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            double numSum = numbers.Sum();

            Console.WriteLine("The sum of the numbers is {0}.", numSum);

        }

 

        public void Sum2()

        {

            string[] words = { "cherry""apple""blueberry" };

            double totalChars = words.Sum(w => w.Length);

            Console.WriteLine("There are a total of {0} characters in these words.", totalChars);

        }

 

3_6.jpg

[그림 3-6] Sum 실행 결과

Min/Max

조회된 결과값의 최소값/최대값을 반환합니다.

 

        public static void Min1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            int minNum = numbers.Min();

            Console.WriteLine("The minimum number is {0}.", minNum);

        }

 

        public static void Max1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            int maxNum = numbers.Max();

            Console.WriteLine("The maximum number is {0}.", maxNum);

        }

 

 3_7.jpg

[그림 3-7] Min/Max 실행 결과

 

기타 표현식

Join

서로다른 데이터를 조인하여 결과를 반환하는 구문입니다관계형 데이터베이스 경우 이런 구문을 자주 사용하여 데이터를 조회합니다아래 소스는 카테고리가 동일한 데이터만 출력하는 예제입니다.

 

        public static void Join1()

        {

            string[] categories = new string[]{ "Beverages""Condiments""Vegetables""Dairy Products""Seafood" };

            List<Product> products = GetProductList();

 

            var q = from c in categories

                    join p in products on c equals p.Category

                    select new { Category = c, p.ProductName };

 

            foreach (var v in q)

                Console.WriteLine(v.ProductName + ": " + v.Category);

        }

 

        private static List<Product> GetProductList()

        {

            List<Product> products = new List<Product>();

            products.Add(new Product("Beverages""Beverages1"));

            products.Add(new Product("Vegetables""Vegetables1"));

            products.Add(new Product("Dairy Products""Dairy Products1"));

            products.Add(new Product("Seafood""Seafood1"));

            products.Add(new Product("Source""Source1"));

 

            return products;

        }

 

 3_8.jpg

[그림 3-8] Join 실행 결과

 Into

Database에 프로시져에서 임시로 데이터를 저장 해놓는 temp table을 사용할 경우가 있습니다그와 같이 into문도 임시로 데이터를 저장해야할 경우에 사용하는 구문입니다즉 임시 저장소를 만드는 것이지요~

 

            var orderGroups = from prod in products

                              group prod by prod.Category into prodGroup

                              select prodGroup;

 

소스를 보면 prod라는 개체에서 Category별로 그룹을 지었습니다그 결과를 into구문을 사용하여 prodGroup에 담았습니다최종적으로 prodGroup 결과를 반환하게 됩니다어떤 의미로 사용하는지 아시겠지요??? ^.^

 

LINQ는 앞으로 엔티티 프레임워크를 나가기 전에 사전에 준비되어야 하는 사항인지라 간략하게 알아보았습니다작성된 샘플(EF4.03.zip)을 함께 업로드 해드리겠습니다참고해주시고 끝까지 읽어주셔서 감사합니다.~~*

sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/390183


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:27

Entity Framework 4.0 기능 살펴보기

이번 시간에는 본격적으로 Entity Framework 4.0에 대해서 알아보겠습니다. Entity Framework는 데이터와 객체(Entity)관계를 쉽게 맺어줌으로 실제적으로 ORM 프레임워크로 간주할 수 있습니다. Entity Framework 4.0으로 업데이트되면서 보강된 더 강력해진 대표 기능에 대해서 살펴보겠습니다고고씽~

 

대표 기능

다양한 데이터베이스 서버 지원

Data Store가 다음과 같으면 언제 어디서든 Entity Framework를 사용 할 수 있다. MS SQL, Oracle, MySql, PostgreSQL, SQL Anywhere, DB2, Informix, U2, Ingres, Progress, Firebird, Synergy, Virtuoso등이 있습니다굉장히 많죠저희가 주로 쓰는 MS SQL, Oracle, MySql가 될것 같은데요. Entity Framework ADO.NET Data Provider 상위에서 빌드되기 때문에 이런 많은 데이터베이스 지원이 가능했습니다.
2_1.jpg 
[
그림 2-1] Entity Framework

 

통합된 Visual Studio 도구 제공

Visual Studio Tool에서 시각적인 Entity 모델과 기존 데이터베이스 개체 모델화를 자동으로 생성해준다또한 새로운 데이터베이스도 Visual Studio에서 모든 권한을 편집하여 배포 가능하다. Visual Studio의 가장 큰 장점인 드래그 앤 그롭이 가능하다는 것 입니다아주 쉽게 EDM(Entity Data Model)을 생성할 수 있죠~

 

POCO(Plain Old CLR Objects) 지원

기존 버전에서는 데이터 저장소와 논리적 객체(Entity)간의 연관성이 표현되지 않았습니다이를 지속성 무시 개체 POCO라고 불리는데요이번 버전에서는 영속성을 지원하는 POCO Entity가 제공됩니다
POCO Entity
 System.Data.Objects.ObjectContext 클래스를 상속 받는데요이 클래스에서 제공되는 메서드는 데이터 저장소와 엔티티간의 영속성을 지원 가능하게 해준다
.
http://msdn.microsoft.com/ko-kr/library/system.data.objects.objectcontext.aspx

 

Model-First 지원

Entity Framework 이전 버전에서 개념적 모델을 만들 수 있었습니다다만 개념적 모델은 데이터베이스 마법사를 통해서 생성되기 때문에 모델은 DB기반의 모델에 존속 될 수 밖에 없었습니다. Entity Framework 4.0에서는 기존방식도 지원하고 개념적 모델이 DB에 물리적 개체가 없어도 모델링이 가능하게 지원한다이를 Model-First라고 합니다.

 

관계 Object의 지연 실행

지연 실행에 대해서는 기존 버전에도 존재하며 LINQ의 대표 기능이기도 합니다다만 관계형에 대해서는 표현이 되지 않았는데요이번 버전에서 쿼리 결과가 명시적으로 탐색 속성에서 관계형 개체를 확인 할 수 있습니다.

 

엔티티 질의 LINQ 함수

Entity Framework 초기 버전에서는 함수의 지원이 제한되어 있었습니다여기서 말하는 함수는 저장 프로시져나 데이터베이스UDF를 말하는데요새로운 EntityFunctions SqlFunctions 클래스가 이 이슈를 해결하기 위해 추가 되었습니다이 클래스들은 개발자에게 LINQ로 엔티티 질의를 할 수 있게 기능을 제공합니다.

 

Complex Type 지원

Visual Studio 2010 Entity Data Model Designer에서 원하는 복잡한 타입을 쉽게 정의 할 수 있습니다모델 탐색기에서 트리로 보여주는데요아래 그림처럼 모델 탐색기에서 Complex Type을 생성 할 수 있으며 여기서 정의된 타입은 Entity 속성으로 사용됩니다.
2_2.jpg

[그림 2-2] Model Browser

 

모델 브라우저 개선

Entity Framework 4.0이 릴리즈되면서 모델 브라우저에 몇 가지들이 개선되었다.

l  기본 데이터베이스가 변경 사항이 있을 때 모델 업데이트

l  모델에서 객체 삭제하기

l  스토리지와 개념적 모델에서 지정한 문자열 검색 기능

l  디자인 화면에서 매핑 된 Entity 타입 찾기

 

 

Entity Framework의 장점

1.      개발시간 절감된다.

2.      개발자는 응용프로그램을 구현하는 입장에서 객체 모델의 관점에서 작업할 수 있다.

3.      응용프로그램은 독립적인 개념적 모델을 지원함으로써 실제 데이터 저장소에 대한 종속이 해방될 수 있다.

4.      객체 모델과 특정 데이터 저장소의 스키마 사이의 매핑인 응용프로그램의 코드를 변경하지 않고도 가능하다.

5.      LINQ지원으로 개념적 모델에 대한 질의 시에 인텔리센스가 제공되며 컴파일 타임에서 구문 유효성 검사가 제공된다.

 

다음 세션부터 실전입니다.! 실전으로 통해서 위에서 말하는 기능들이 무엇인고~에 대해서 더 잘 이해 될 것입니다끝까지 읽어주셔서 감사합니다.^^

 

참고 URL

http://msdn.microsoft.com/en-us/data/dd363565.aspx
http://msdn.microsoft.com/en-us/data/aa937709
http://msdn.microsoft.com/en-us/data/aa937723
http://archive.msdn.microsoft.com/cs2010samples



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/390175


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:26

Entity Framework 들어가기

최근 닷넷계에서 화두 되고 있는 분야 중에 하나가 오픈 소스일 것 입니다우리는 그 동안 닷넷프레임워크에서 제공되는 Base Class Library 기반에 어플리케이션을 잘 구현해왔죠하지만 좀 더 효율적으로 좀 더 유연하게 프로젝트를 수행하기 위해 자바처럼 여러 프레임워크의 장점들을 닷넷 프레임워크와 함께 선택적으로 사용하고자 하는 need가 생겨나기 시작했죠하여 iBatis.net이나 spring.net, log4.net등의 닷넷 버전의 오픈 소스 프레임워크가 나타나게 되었습니다이런 시대의 흐름을 MS가 인지하여서 일까요? MS ORM기반의 Entity Framework를 릴리즈하였습니다아직까지 닷넷계에서는 오픈 소스가 자바계만큼 크게 활용되고 있지는 않지만 오픈 소스가 많은 프로젝트에 닷넷과 함께 활용될 때 닷넷 기술도 성장 할 수 있지 않을까 조심스레 생각해봅니다하여 이번 아티클에서 프레임워크와 엔티티 프레임워크에 대해서 소개를 하려 합니다.

 

프레임워크의 개념

과연 프레임워크는 무엇일까이 아티클을 읽는 분들은 대부분 개발자이거나 이 분야 전공 학생일 것입니다그쵸지금 여러분들의 머릿속에 프레임워크에 관련된 뭔가가 두리뭉실하게 그려질 것입니다프레임워크란 기반이 되는 뼈대라고 생각하면 됩니다.예를 들어 건물을 짓는 것을 봤다면 건물이 다 지어지기 전까지 그 건물이 상가인지 아파트인지 한옥인지 알 수 없습니다다만 건물을 짓기 위한 공통된 작업 즉 초기에 땅을 파고 땅에서 물과 돌을 제거하죠기반을 단단히 다지는 작업인데요이런 밑그림,기반 틀이 프레임워크입니다.

닷넷 개발자라면 닷넷 프레임워크 기반에서 개발을 수행하게 되는데요닷넷 프레임워크는 보시다시피 닷넷 Base Class Library기반으로 응용프로그램을 구현합니다.

1_dotnet framework.gif

[그림 1-1] .NET Framework

사실 닷넷을 사용하는데 가장 큰 장점 중 하나가 Base Class Library가 제공된다는 것입니다파일을 핸들링 하기 위해서 닷넷에서 제공되는 System.IO DataBase를 사용하기 위해 ADO.NET을 이용하면 보다 빠르고 쉽게 응용프로그램을 구현할 수 있습니다.이런 개념만 이해한다면 초보개발자도 닷넷 기술을 이용하여 응용프로그램을 후닥 개발할 수 있죠~

2_Class Library.jpg

[그림 1-2] .NET Framework Class Library

개발자 측면에서 프레임워크란 이처럼 응용프로그램을 만들기 위해서 기반이 되어주는 기능별로 모듈화가 되어 있고 재사용 가능한 구조틀이라고 정의할 수 있습니다.

 

닷넷계 연계 가능한 오픈소스

자바 진영에서는 수많은 프레임워크가 있다프로젝트 특성에 맞춰 프레임워크가 선택적으로 사용되기도 하죠웹 어플리케이션 영역에서 활용되는 벨로시티 프레임워크나 스프링 프레임워크, Data 매핑의 Hibernate, iBatis 프레임워크로깅관련 된 Log4J 프레임워크 등등의 프레임워크가 있습니다이 모든 프레임워크가 자바 진영에서는 활용될 수 있는 것은 그만큼 오프소스에 대해 열려있었기 때문인데요그에 비해 닷넷은 오픈 소스에 대해서 폐쇄적이었습니다최근에 들어서는 닷넷계에서도 닷넷 기반에서 오픈소스 프레임워크 접목하려는 시도가 점차 늘어가고 있습니다. ORM(Object Relational Mapping)  iBatis.NET이나 NHibernate, loc(Inversion of Control)기반의 Spring.NET 등이 있는데요이는 닷넷 버전으로 자바에서 사용되었던 프레임워크가 컨버팅 된 닷넷 버전 프레임워크입니다. Entity Framework 아티클이 마무리되면 위에 언급한 프레임워크를 자세히 소개하는 시간을 가져보겠습니다.

 

위대한 탄생엔티티 프레임워크 탄생!

오픈 소스에서 ORM에 관련된 프레임워크가 인기를 끌게 되면서 MS는 기존의 ADO.NET에서 ORM 기반의 프레임워크를 Visual studio 2008 sp1에 정식 릴리즈 했습니다그것이 바로 Entity Framework입니다.

3_EF_OverView.PNG

[그림 1-3] Entity Framework 아키텍처H:%5CEF%20%EC%9E%90%EB%A3%8C%5C%EC%95%84%ED%8B%B0%ED%81%B4%5C1%EA%B0%95%5CEF_%EC%84%9C%EB%B9%84%EC%8A%A4%EC%8A%A4%ED%83%9D.png

Entity Framework Data Entity로 매핑 할 수 있는 것으로 우리가 흔히 쓰는 Database 개체들을 Object화 할 수 있습니다. Entity Framework가 릴리즈 될 당시에 .NET Framework 3.5에서는 LINQ가 포함되어 관계형 데이터를 보다 용이하게 질의할 수 있게 제공하였는데 Entity Framework가 추가되면서 개발자로 하여금 더 높은 생산성의 향상을 기대하게 하였죠또한 Entity Framework는 직관적인 DAO(Data Access Object) 패턴의 응용프로그램을 구현하게 됩니다.

4_EF_서비스스택.PNG

[그림 1-4] Service Stack

위 그림에서 보여주는 것과 같이 Entity Client는 중간에서 기존의 Linq To Entities Entity SQL을 ADO.NET 모델로 확장을 합니다

이번 아티클은 OverView 수준이었습니다다음 아티클부터는 본격적으로 Entity Framework에 대해서 알아보겠습니다.^^ 끝까지 읽어주셔서 감사합니다.^.^



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/373895

Posted by 사나에
개발 이야기/DB2011. 12. 20. 16:58

For a further investigation, please try these steps as below: 

  1. Enable IntelliSense: 

    1. For all query windows, please go to Tools >> Options >> Text Editor >> Transact-SQL >> IntelliSense, and select Enable IntelliSense.
    2. For each opening query window, please go to Query >> Intellisense  Enabled.  
  2. Refresh IntelliSense local cache: please go to >> Edit >> IntelliSense >>Refresh Local Cache or use the CTRL+Shift+R keyboard shortcut to refresh.
  3. Enable statement completion: please go to Tools >> Options >> Text Editor >> Transact-SQL >> General, and check on Auto list members and Parameter information boxes.
  4. Reboot SQL Server Management Studio.



출처 : http://social.msdn.microsoft.com/Forums/en/sqltools/thread/36e3d0db-3150-434a-885d-97810fe199c5
Posted by 사나에
개발 이야기/Visual C#2011. 4. 21. 20:48

벌써 3번째입니다. ^^
오늘 주제는 작은 함수에 대한 부분인데요. 여기서 말하는 함수라는 것은 메서드단위로 생각하시면 됩니다.
사실 메서드 보다는 JIT에 대한 이해라고 생각하셔도 됩니다.

 
아시다시피 우리가 작성하는 C#, VB기타 소스코드는 컴파일되면 MSIL이라는 중간언어로 생성됩니다. 이는 닷넷런타임에서 JIT컴파일러가 이 MSIL코드를 머신(machine) 코드로 바꾸도록하는 것이지요~ 여기서 JIT 컴파일러가 IL코드를 읽어오는 부분을 보시면 왜 우리가 작고 간단한 메서드로 구현을 해야하는지 알게 됩니다.
저희는 다음과 같이 소스코드를 작성했습니다.

 
    class Program
    {
        static void Main(string[] args)
        {
            string result = BuildMsg(true);
        }

        public static string BuildMsg(bool takeFirstPath)
        {
            StringBuilder msg = new StringBuilder();
            if (takeFirstPath)
            {
                msg.Append("A problem occurred.");
                msg.Append("\nThis is a problem.");
                msg.Append("imagine much more text");
            }
            else
            {
                msg.Append("This path is not so bad.");
                msg.Append("\nIt is only a minor inconvenience.");
                msg.Append("Add more detailed diagnostics here.");
            }
            return msg.ToString();
        }

        private static string SecondPath()
        {
            throw new NotImplementedException();
        }

        private static string FirstPath()
        {
            throw new NotImplementedException();
        }

        public static string BuildMsg2(bool takeFirstPath)
        {
            if (takeFirstPath)
            {
                return FirstPath();
            }
            else
            {
                return SecondPath();
            }
        }
    }


위 소스코드의 IL을 IL 디어셈블러로 확인해보면 다음과 같이 메서드 단위로 떨어지는 것을 볼 수 있습니다.























함수 하나를 클릭해서 상세히 살펴보겠습니다.


함수 하나를 호출할 경우 해당 메서드 안에 있는 코드 모두를 로드하게 됩니다. 그렇다면 메서드 안에서 다른 메서드를 호출하는 경우는 어떨까요?
아래 처럼 call이라는 코드를 보실 수 있습니다. 분개부분에서 필요한 메서드만 다시 호출하게 되는거죠. 결국 사용하지 않는 리소스를 로드하지 않아 JIT컴파일러는 보다 효율적으로 실행 될 수 있겠죠? 바로 이 점때문에 저희는 작고 간단한 메서드 단위로 코딩을 해야하는 이유입니다.


 


Posted by 사나에

What is GeHashCode()?


  • 해시테이블이나 Dictionary 같은 해시코드를 기반으로 하는 collection에 Key로 활용할 타입을 정의하는 경우를 제외하고는 GetHashCode() 메서드를 재정의하지 않는 것이 좋다.
  • GetHashCode() 메서드를 이용하여 collection들의 해시코드를 획득할 수 있다.
  • Regerence 타입에 대해서는 비효율적이긴 하지만 동작한다.
  • Value타입에 대해서는 제대로 동작하지 않는 경우도 있다. ==> 단, immutable타입에 대해서만 정상적으로 동작한다. 물론 비효율적으로 동작.
  • 해시 기반의 컨테이너들은 검색의 최적화를 위해서 해시 코드를 이용하며 모든 객체는 해시 코드라고 불리는 integer 값을 생성한다.
  • 닷넷에서는 모든 객체들이 해시 코드를 가지고 있으며 이값은 System.Object.GetHashCode()에 의해서 반환된다.
  • GetHashCode()를 재정희하기 위한 3가지 규칙
    1. 만일 두 개의 객체가 동일하다면 두 객체는 동일한 해시 코드를 생성해야 한다. 하지만 해시 코드를 이용하여 특정 컨테이너 내에서 다수의 객체들을 찾아내는 데 사용할 수 없다.
    2. 특정 객체 a에 대해서 a.GetHashCode()의 반환값은 객체의 인스턴스가 생성된 이후에는 변하지 않아야 한다. 어떠한 시점에 a 객체의 GetHashCode()를 호출하더라도 반환되는 값은 항상 동일해야 한다. 해시 기반 컨테이너 내에서는 객체를 찾을 때 해시 코드를 이용하여 저장 공간을 검색하기 때문에 이 값이 변경되면 객체가 저장된 올바른 저장 공간을 찾지 못할 수 있다.
    3. 해시 함수는 모든 입력 값에 대해서 integer의 표현범위 내에서 골고루 잘 분산되어야 한다. 이러한 특성이 해시기반 컨테이너의 수행 성능에 영향을 미친다.
  • 실제로 Object.GetHashCode()는 System.Object 클래스에 존재하는 내부값을 반환하는 역할만 한다.
  • 이 값은 System.Object의 객체 생성자에 의해서 만들어지고 1부터 시작하여 매 객체 생성 요청때마다 1씩 증가되는 값을 생성하도록 구성하여 이 값을 반환할 뿐이다.



http://msdn.microsoft.com/ko-kr/library/system.object.gethashcode.aspx
http://msdn.microsoft.com/ko-kr/library/system.object.aspx

Posted by 사나에
개발 이야기/www.Web2011. 3. 27. 20:13

RAZOR - 웹메트릭스

{CODE PARTY} 1차 세미나 - ASP.NET Razor (1/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (2/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (3/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (4/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (5/5)



Posted by 사나에