Entity Framework

C#, .NET 2011. 6. 17. 19:27
출처 : http://hoons.kr/Lecture/LectureView.aspx?BoardIdx=25858&kind=26



[ C#.NET 고급강좌]
  Entity Framework을 만나다.
 작성자 : 김수영  작성일 : 2009-08-13 오전 7:55:49
 E-mail : dotnethelper골뱅이gmail.com  Homepage : http://www.dotnetngene.kr
 첨부파일

 2009년 5월호로 월간 마이크로소프트웨어에 기고했던 기사로 
HOONS닷넷과 함께하는 닷넷 인사이드(ASP.NET편)의 3회차 기사입니다.

연재순서
1회 | 2009. 03 | 함께 시작해요! ASP.NET MVC
2회 | 2009. 04 | Write less, Do more jQuery
3회 | 2009. 05 | Entity Framework을 만나다
4회 | 2009. 06 | 닷넷 차트 컨트롤 <asp:chart runat="server"/>

김수영 dotnethelper골뱅이gmail.com | 현재 MIS 관련 개발을 業으로 .NET을 지원하는 응용기술(MOSS, VSTO, SQL CLR 등)에 대한 많은 관심을 가지고 있다. 훈스닷넷 Visual C# 시삽으로 커뮤니티 세미나를 진행하고 있으며 2007년부터 Microsoft Visual C# MVP로 활동하고 있다. 앞으로 .NET 응용 기술의 기본이 되는 언어라고 할 수 있는 Visual C#의 효율적 개발을 위한 다양한 의견 공유를 가졌으면 한다.


프로그램 개발에 있어 많은 비중을 차지하는 것 중 하나가 바로 DB와 상호 연동하여 데이터를 처리하는 작업일 것이다. 사회가 발전하면 할 수록 처리되어야 하는 데이터의 양은 기하 급수적으로 증가가 되고, 그에 따른 데이터 구조 또한 점점 더 복잡하게 구성이 되어지고 있다. 그리고 이러한 데이터를 위하여 DB 스키마를 정의 할 경우 DB의 성능 등 시스템을 위한 정규화로 많이 이루어져 실제 비즈니스 로직을 처리하기 위한 구조와의 이질감이 발생 한다. 이와 같은 이유로 DB의 스키마를 비즈니스 스키마로 구성을 하는 ORM(Object-relational mapping)이 대두가 되었으며 오픈 소스에서는 Hibernate를 통해 실제적으로 개발을 진행 할 수 있다. 닷넷에서도 데이터 처리를 위한 많은 기능을 제공해 주고 있으며, LINQ to SQL에 이어 엔터프라이즈 환경을 위한 닷넷 프레임웍(.NET Framework) 3.5 SP1에 새롭게 엔티티 프레임웍(Entity Framework)이 등장하였다. 이번 강좌에서는 엔티티 프레임웍이란 친구를 소개 받는 자리를 가져 보겠다.

닷넷 프레임웍 히스토리

먼저 닷넷 프레임웍의 변화과정에 대하여 잠깐 살펴 보도록 하자. 2002년 닷넷 프레임웍 1.0 이후 현재 닷넷 프레임웍 3.5 SP1까지 많은 변화 이루어 졌으며, 올 연말에는 닷넷 프레임웍 4.0에 대한 소식도 들리고 있다. 닷넷 프레임웍 2.0에서는 현재 프레임웍의 기반을 구축하게 되었다. 닷넷 프레임웍 3.0은 2.0 코어 기반에 프리젠테이션을 통합하는 WPF(Windows Presentation Foundation ), 닷넷 리모팅, 웹서비스 등과 같은 분산처리 기술의 통합인 WCF(Windows Communication Foundation), 비즈니스 처리를 표준화 할 수 있는 WF(Windows Workflow Foundation) 등의 기술들이 익스텐션 형태로 추가 되었다. 특히 WPF의 경우는 기존의 윈폼의 정적인 화면 UI에서 혁신적이라고 표현 할 수 있을 정도로 XAML(Extensible Application Markup Language)이라는 XML 기반 마크업 언어를 통해 사용자의 보다 다양한 요구사항을 반영 할 수 있는 UI를 구성 할 수 있게 되었다. 닷넷 프레임웍 3.5에서는 LINQ를 통해 배열, 컬렉션, DB와 XML에 이르기까지 통합된 처리 기술을 지원하고 있으며, HTTP 프로토콜 기반에 URL을 통하여 웹서비스와는 다르게 쉽게 데이터에 접근 처리 할 수 있는 REST(Representational State Transfer를 지원해 주고 있다. 마지막으로 닷넷 프레임웍 3.5 SP1에서는 지금 살펴 볼 마이크로소프트의 ORM 버전이라고 할 수 있는 엔티티 프레임웍, ASP.NET의 다이나믹 데이터(Dynamic Data), ASP.NET MVC의 핵심 기술 중 하나인 ASP.NET Routing이 포함되어 있다. 포털의 뉴스 같은 경우 실제 URL은 긴 경로를 가지고 있지만 트랙백 주소 같은 경우는 짧은 가상 경로를 가지고 있다.  ASP.NET Routing이 바로 이와 같이 URL을 가상 경로를 지정 할 수 있는 인프라를 지원해 준다.


[그림 01] 닷넷 프레임웍 히스토리


엔티티 프레임웍을 만나다.

누군가를 처음 만나게 되면 보통 호구조사(?)라는 것을 들어간다. 우리도 엔티티 프레임웍을 처음 만나는 만큼 어떻게 구성이 되어 있는지 먼저 살펴 보도록 하자. 엔티티 프레임웍은 비즈니스 엔티티 스키마와 DB의 스키마에 대한 정의를 분리하여 유연한 처리를 할 수 있도록 엔티티 데이터 모델(Entity Data Model : 이하 EDM)로 표현을 하고 있다. EDM은 아래와 같이 세 가지 계층으로 이루어진다.
 

[그림 02] 엔티티 데이터 모델 구성

  ● 개념적 스키마 계층(CSDL : Conceptual Schema Definition Language)
  ● 매핑 계층(MSL : Mapping Specification Language )
  ● 논리적 저장소 스키마 계층(SSDL : Store Schema Definition Language)


개념적 스키마 계층은 비즈니스 엔티티의 성격에 맞도록 사용자가 정의 하여 사용 할 수 있으며, 실제적인 DB의 스키마는 논리적 저장소 스키마 계층에서 표현되어 진다. 그리고 이 두 계틍은 매핑 계층을 통해 서로 연결이 되어 있어 기존 LINQ to SQL에 비해 유연한 구성이 가능하다. 각각의 스키마는 XML로 정의 되어 진다. 그럼 우리는 왜 DB의 데이터 스트림 혹은 기존의 DataSet 형태가 아닌 Entity로 다시 구성을 하려고 하는 것일까? 

첫번째는 위에서 언급하였던 것처럼 시스템에 적합한 스키마 구성이 아닌 비즈니스처리에 좀더 적합하게 데이터를 추상화한 엔티티를 구성 할 수 있다. 

두번째는 정의된 엔티티는 C#의 클래스로 정의가 되므로(생성된 클래스는System.Data.Objects.ObjectContext 클래스를 상속 받는다.) 강한 데이터 타입 모델을 지원해 준다. 그러므로 컴파일 타임에서 타입에 대한 체크가 모두 이루어져 타입 오류에 의한 런타임시에 예외를 줄일 수 있다.

엔티티 프레임웍은 EDM과 더불어 데이터를 처리하기 T-SQL과 유사한 구문을 가지는 Entity SQL, 기존 ADO.NET의 SqlClient와 비슷한 역할을 하는 EntityClient, 그리고 LINQ to Entity를 지원하고 있다. 

 
[그림 03] 엔티티 프레임웍 아키텍처


EDM생성

Visual Studio 2008 SP1을 설치하면 [화면 01]와 같이 EDM 생성을 위한 템플릿이 존재한다. [화면 02] 템플릿의 마법사로 EDM을 쉽게 만들 수 있다.


[화면 01] EDM 생성 템플릿
 

[화면 02] EDM 생성 마법사

이렇게 생성된 파일은 [화면 03]과 같이 각 계층 정보를 XML로 구성하고 있다.

 
[화면 03] 생성된 EDM의 XML

생성된 EDM은 기본적으로 DB 스키마와 1:1 매핑을 가지며, 기존 DB의 릴레이션을 모두 가지고 있다. 생성된 구조는 [화면 04]에서 보는 것처럼 DB의 ERD와 유사하다.

 
[화면 04] 생성된 EDM


엔티티 프레임웍 에서의 데이터 처리

엔티티 프레임웍에서는 다음과 같이 다양한 데이터 처리 방법을 지원해 주고 있다.
 
Entity SQL + EntityClient

가장 유연한 처리가 가능한 방법이다. 기존 SQL 구분과 유사한 텍스트 기반의 Entity SQL과 EntityClient를 통하여 데이터를 조회 할 수 있다. Entity SQL + EntityClient의 반환된 데이터 형식은 DbDataReader의 형태로 forward-only 이며, 현재 DML(insert, update, delete)을 지원해 주지 않는다.

 
[그림 04] Entity SQL 구문


EntityClient 이전 SqlClient와 마찬가지로 Connection, Command 등과 관련된 객체를 지원하고 있다.

? EntityConnection
? EntityCommand
? EntityParameter


이전에 ADO.NET을 통한 데이터 처리가 익숙하다면 쉽게 접근 할 수 있을 것이다. 구문이 SqlClient를 사용하는 것과 거의 같다.

using (EntityConnection eCon
= new EntityConnection(ConfigurationManager.ConnectionStrings["pubsEntities"].ConnectionString))
{
    //커넥션 오픈
    eCon.Open();
    string fname = "M%";
    EntityCommand command = eCon.CreateCommand();
    //커맨드 설정(Entity SQL 작성)
    command.CommandText = @"
SELECT VALUE c
FROM pubsEntities.authors AS c
where c.au_fname like @fname
order by c.au_fname";
    //파라미터 설정
    command.Parameters.AddWithValue("fname", fname);
    //쿼리 실행
    DbDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess);
    //검색된 데이터 처리
    while (reader.Read())
    {
        Console.WriteLine(reader["au_fname"]);
    }
    Console.WriteLine("============== Trace ==============");
    Console.WriteLine(command.ToTraceString());
    reader.Close();
}

[코드 01] Entity SQL + EntityClient

Entity SQL + 객체서비스

Entity SQL + EntityClient가 반환하는 데이터 형식이 스트림 형식의 DbDataReader인 반면에 Entity SQL + 객체서비스는 반환되는 데이터 형식이 생성된 엔티티의 특정 객체로 반환이 되어 진다. 그러므로 SQL 구문의 유연함과 객체를 통한 데이터 처리를 원한다면 이 방법을 사용하면 된다. System.Data.Objects.ObjectContext 상속받아 생성된 객체를 이용하여 자료를 탐색 할 수 있다.

using (pubsEntities entity = new pubsEntities())
{
    string fname = "M%";
 //파라미터를 지정한다.
    ObjectParameter param = new ObjectParameter("fname", fname);
 //쿼리를 실행하여 결과를 객체로 반환을 한다.(Entity SQL 작성)
    ObjectQuery<authors> items = entity.CreateQuery<authors>(
        @"
SELECT VALUE TOP(2)  c
FROM pubsEntities.authors AS c
WHERE c.au_fname like @fname
ORDER BY c.au_fname
", param);
 //객체를 통해 멤버에 쉽게 접근 할 수 있다.
    foreach (authors item in items)
    {
        Console.WriteLine(item.au_fname);
    }
    Console.WriteLine("============== Trace ==============");
    Console.WriteLine(items.ToTraceString());
}

[코드 02] Entity SQL + 객체서비스

LINQ to Entity + 객체서비스

마지막으로 LINQ to Entity + 객체서비스를 이용하는 방법이다. LINQ 구문이 벌써 몸에 익숙해 졌다면 아마도 쉽게 접근 할 수 있을 것이다. 위의 두 경우는 텍스트의 Entity 구문을 작성하는 반면 LINQ to Entity + 객체서비스는 데이터 처리를 위한 구문을 LINQ로 작성을 한다. 그리고 Entity SQL + EntityClient에서 지원하지 않던 DML 작업을 지원한다.

DML 작업 후에는 LINQ to SQL에서 항상 마지막에 DataContext.SummitChange() 메소드를 호출 하여야 최종적으로 DB에 적용이 되는 것처럼 ObjectContext.SaveChanges() 메소드를 반듯이 호출 하여야 DB에 반영이 이루어 지게 된다.

using (pubsEntities entity = new pubsEntities())
{
    string fname = "M";
    var items = from x in entity.authors
                where x.au_fname.StartsWith(fname)
                select x;
    foreach (authors item in items)
    {
        Console.WriteLine(item.au_fname);
    }
    Console.WriteLine("============== Trace ==============");
    Console.WriteLine(((ObjectQuery)items).ToTraceString());
}
[코드 03] LINQ to Entity + 객체서비스 조회


Insert 작업에서는 ObjectContext의 AddTo엔티티() 메소드들이 생성되어 있다. 이 메소드를 통하여 작업이 이루어 진다. 마지막에 SaveChanges() 메소드 호출하는 것일 잊지 말기 바란다.

authors au = new authors
{
    au_id = "999-99-9999",
    au_lname = "Kim",
    au_fname = "suyoung",
    phone = "999 999-1234",
    address = "12345 Av.",
    city = "Seoul",
    state = "KO",
    zip = "12345",
    contract = true
};
entity.AddToauthors(au);
entity.SaveChanges();
[코드 04] LINQ to Entity + 객체서비스 Insert

아래와 같이 Update 구문을 작성 할 수 있다.

var au = (from x in entity.authors
         where x.au_id == "999-99-9999"
         select x).First();//Single 지원하지 않음
au.phone = "999 999-5678";
entity.SaveChanges();
[코드 05] LINQ to Entity + 객체서비스 Update

ObjectContext의 DeleteObject() 메소드를 통해 Delete 작업이 가능하다.

authors au = new authors
{
    au_id = "999-99-9999",
    au_lname = "Kim",
    au_fname = "suyoung",
    phone = "999 999-1234",
    address = "12345 Av.",
    city = "Seoul",
    state = "KO",
    zip = "12345",
    contract = true
};
entity.AddToauthors(au);
entity.SaveChanges();
[코드 04] LINQ to Entity + 객체서비스 Insert 아래와 같이 Update 구문을 작성 할 수 있다.
var au = (from x in entity.authors
         where x.au_id == "999-99-9999"
         select x).First();//Single 지원하지 않음
au.phone = "999 999-5678";
entity.SaveChanges();
[코드 05] LINQ to Entity + 객체서비스 Update
ObjectContext의 DeleteObject() 메소드를 통해 Delete 작업이 가능하다.
var au = (from x in entity.authors
          where x.au_id == "999-99-9999"
          select x).First();//Single 지원하지 않음
entity.DeleteObject(au);
entity.SaveChanges();
[코드 06] LINQ to Entity + 객체서비스 Delete


LINQ to SQL vs. 엔티티 프레임웍

닷넷 프레임웍 3.5에서는 먼저 DB의 데이터를 처리 할 수 있는 LINQ to SQL이 존재한다. 그럼 Entity Framework와는 어떤 차이점을 가지고 있을까?

LINQ to SQL은 중소 규모에서 빠른 개발이 필요할 경우 고려해 볼 수 있으며, Entity Framework의 경우는 엔터프라이즈 환경의 이기종 DB 지원 혹은 복잡은 구성이 필요할 경우 사용할 수 있을 것이다.

●  LINQ to SQL
 - Microsoft SQL Server만 지원
 - DB 스키마정보(테이블, 컬럼 정보 등)를 클래스에 직접 선언
 - 스트림으로 데이터를 읽을 수 없음

 ●  Entity Framework
 - 다양한 이기종 DB 지원(Oracle, DB2등)
 - CSDL, MSL, SSDL 형태로 분리하여 유연한 구성 가능
 - EntityClinet를 통한 DbDataReader로 처리 가능

ASP.NET에서의 사용

ASP.NET도 그리드 관련 컨트롤들은 데이터 소스로 엔티티 데이터를 지원한다. 그리고 데이터 소스 타입에 LINQ와 마찬가지로 [화면 05]와 같이 EntityDataSource 컨트롤이 존재하여 쉽게 엔티티 데이터를 설정 가능 하다. 
 

[화면 05] ASP.NET EntityDataSource 컨트롤

ListView와 같은 그리드 컨트롤에 데이터 소스로 엔티티를 바인딩 한 후 비하인드의  ItemDataBound 이벤트에서 DataRowView view = e.Item.DataItem as DataRowView;(DataSource가 DataTable일 경우) 같은 방식으로 현재 바인딩되는 DataItem을 가지고 사용자가 다양한 처리를 할 수 있다. 바인딩되는 데이터가 완전한 엔티티일 경우는 해당 엔티티 객체로 형식을 변환 하면 되지만 엔티티에서 검색된 결과를 C# 3.0에서 새롭게 나온 익명형식(Anonymous Type)으로 바인딩이 될 경우는 DataItem의 형 변환을 어떤 타입으로 변경할지 고민이 필요하다. 
다음 예제는 pubs라는 SQL 테스트 DB의 titile 테이블에서 데이터를 엔티티를 통해 조회하고 ListView에 바인딩 하는 예이다. 바인딩 할 엔티티를 검색해 보자. title 테이블에서 type이 “business”인 데이터를 익명형식으로 필요한 필드만 검색 하였다.

private void EntityDataBind()
{
    using (pubsEntities db = new pubsEntities())
    {
        //검색 결과를 익명형식으로 만듬.
        var items = from x in db.titles
                    where x.type == "business"
                    select new
                    {
                        x.title_id,
                        x.title,
                        x.type,
                        x.ytd_sales
                    };         this.lvEntityView.DataSource = items;
        this.lvEntityView.DataBind();
    }
}
[코드 07] 데이터 조회를 조회하여 ListView에 바인딩

ListView에 바인딩 하는 UI 코드는 [코드 08]처럼 검색된 익명타입은 Eval() 메소드를 통해 값을 바인딩 할 수 있다. 


<asp:ListView ID="lvEntityView" runat="server" OnItemDataBound="lvEntityView_ItemDataBound">
    <LayoutTemplate>
        <table style="border:solid 1px black">
          <tr>
            <td style="border:solid 1px black">title_id</td>
            <td style="border:solid 1px black">title</td>
            <td style="border:solid 1px black">type</td>
            <td style="border:solid 1px black">royalty</td>
          </tr>
          <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
        </table>
      </LayoutTemplate>
      <ItemTemplate>
        <tr id="tr01" runat="server">
          <td id="Td1" runat="server" style="border:solid 1px black">
            <asp:Label ID="Label1" runat="server" Text='<%#Eval("title_id") %>' />
          </td>
          <td id="Td2" runat="server" style="border:solid 1px black">
            <asp:Label ID="Label2" runat="server" Text='<%#Eval("title") %>' />
          </td>
          <td id="Td3" runat="server" style="border:solid 1px black">
            <asp:Label ID="Label3" runat="server" Text='<%#Eval("type") %>' />
          </td>
          <td id="Td4" runat="server" style="text-align:right;border:solid 1px black">
            <asp:Label ID="Label4" runat="server" Text='<%#Eval("ytd_sales") %>' />
          </td>
        </tr>
    </ItemTemplate>
</asp:ListView>
[코드 08] ASP.NET ListView 구성

여기서 ytd_sales 필드의 포맷이 1000의 자리마다 컴마(,)로 표시해야 한다는 요구사항이 나왔다고 가정을 하면 비하인드 ItemDataBound 이벤트에서 어떠한 작업을 처리하는 코드를 작성하여야 한다. 데이터를 처리 하기 위해서는 이벤트에서 바인딩된 원본 타입으로 형변환을 하여야 하지만, 우리는 익명타입으로 바인딩이 이루어 졌다. DataItem을 무엇으로 변환 하여야 할 것인가? 이러한 경우는 리플렉션을 통해 처리가 가능하다. 구하고자 하는 프로퍼티를 Type.GetProperty() 메소드를 통해 가져 온 후 PropertyInfo.GetValue()에서 값을 가져 오면 된다.


protected void lvEntityView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    using (ListViewDataItem boundItem = e.Item as ListViewDataItem)
    {
        if (boundItem.ItemType == ListViewItemType.DataItem)
        {
            Label lbl = boundItem.FindControl("Label4") as Label;
            //특정한 형식으로 형변환을 할 수 없으므로 리플렉션 이용
            Type ty = boundItem.DataItem.GetType();
            PropertyInfo pInfo = ty.GetProperty("ytd_sales");
            if (pInfo != null)
            {
                int amt = Convert.ToInt32(pInfo.GetValue(boundItem.DataItem, null));
                lbl.Text = amt.ToString("N0");
            }
        }
    }
}
[코드 09] ItemDataBound 이벤트에서 익명 타입 리플렉션

우리가 원하는 결과로 화면이 조회 되는 것을 볼 수 있다.
 

[화면 06] 조회 결과 화면

정리

닷넷 프레임웍 3.5 SP1에 새롭게 소개된 데이터 처리 방법인 Entity Framework에 대한 첫 만남을 가져 보았다. Entity Framework은 복잡한 DB의 데이터 구조를 좀더 비즈니스에 처리에 적합한 데이터 구조로 설정을 하고, 개발 생산성을 높이는데 많을 도움을 줄 것이다. 오늘 살펴본 내용 이외에 실제 WCF와 같은 분산처리 환경에서의 사용, ADO.NET DataService와의 연계, 성능 향상 방법 등에 대해서는 앞으로 많은 고찰이 필요할 것이다. 마지막으로 본문에 나온 그림 일부는 MSDN에 나와 있는 그림을 참고 하였다.

Tools Download
샘플 데이터베이스 : http://sqlserversamples.codeplex.com/
Microsoft SQL Server 2008 Express : http://www.microsoft.com/express/sql/download/

Reference
- Programming Entity Framework | O'Reilly | ISBN 10: 0-596-52028-X
- Entity Framework 소개 
http://msdn.microsoft.com/ko-kr/library/bb399567.aspx 
- ADO.NET Entity Framework 개요 
http://msdn.microsoft.com/ko-kr/magazine/cc163399.aspx 
- Entity Framework Q&A
http://msdn.microsoft.com/ko-kr/magazine/cc507640.aspx 
- Entity Framework로 유연한 데이터 모델링 구현 
http://msdn.microsoft.com/ko-kr/magazine/cc700331.aspx 
- 계층 아키텍처에서 Entity Framework 사용 
http://msdn.microsoft.com/ko-kr/magazine/cc700340.aspx 
- LINQ To SQL과 Entity Framework를 사용한 유연한 데이터 액세스 
http://msdn.microsoft.com/ko-kr/magazine/dd263098.aspx 
- ADO.NET Entity Framework & LINQ to Relational Data
http://code.msdn.microsoft.com/adonetefx/ 
평점: 9.5/10 (2명 참여)    
트랙백 주소 : http://www.hoons.kr/25858/BoardTrackback.aspx (<input type="button" value="트랙백보내기" style="font-family: 'Malgun Gothic', 돋음, 'Trebuchet MS', 'Lucida Grande', Tahoma, Helvetica, Arial, sans-serif; font-size: 12px; border-right-width: 1px; border-right-style: solid; border-right-color: initial; border-top-width: 1px; border-top-style: solid; border-top-color: initial; border-left-width: 1px; border-left-style: solid; border-left-color: initial; width: 100px; color: rgb(108, 139, 180); border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: initial; height: 22px; background-color: white; ">)
등록된 트랙백 0 

<textarea name="Comment1$txtContent" rows="2" cols="20" id="Comment1_txtContent" style="font-family: 'Malgun Gothic', 돋음, 'Trebuchet MS', 'Lucida Grande', Tahoma, Helvetica, Arial, sans-serif; font-size: 12px; border-top-style: groove; border-right-style: groove; border-bottom-style: groove; border-left-style: groove; height: 120px; width: 408px; "></textarea>
<input type="image" name="Comment1$btnInsert" id="Comment1_btnInsert" src="http://hoons.kr/img/Icon/fish.gif" align="absmiddle" style="font-family: 'Malgun Gothic', 돋음, 'Trebuchet MS', 'Lucida Grande', Tahoma, Helvetica, Arial, sans-serif; font-size: 12px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; ">

372  1039
 sa2랑            [2009-08-13]
Level 52 
 [EXP.128/250]
이기종 DB의 경우에 어떻게 사용하나요?

88  559
 귀뫄뉘            [2009-09-10]
Level 41 
 [EXP.25/100]
훌륭한 아티클 감사합니다.. LinqToSQL은 실무에 적용해봤는데, "정말 빠른 친구들.."처럼 뛰어난 개발생산성을 자랑하더군요... 다만 DataSet과 변환이 자유롭지 않고

88  559
 귀뫄뉘            [2009-09-10]
Level 41 
 [EXP.25/100]
Join이나 익명타입의 결과를 반환해서 인자로 넘길때 귀찮은 일이 좀 많아지더군요.. 역시 유연성이 떨어지는듯... EDM은 아직안써봤지만 사실 현재로선 Typed DataSet과의 차이점을 그닥 모르겠습니다.. Typed DataSet도 RDB구조와 다르게 추상적으로 스키마 구성할수 있고.. 당근 객체처럼 쓸수 있고.. 다 되는건데 뭐가 장점으로 올 수 있을지 아직은 잘 모르겠네요..

12  5
 강덕현            [2010-02-10]
Level 2 
 [EXP.0/16]
Oracle 에 한번 붙여 볼려고 여러모로 노력을 해 봤는데, 기본적인 Simple 한 DB 구조는 문제 없지만.
복잡한 구조는 에러를 뿜어 내더군요... 하반기를 기다려 봐야 겠네요..

12  13
 소년하루            [2010-02-18]
Level 3 
 [EXP.5/16]
LINK TO SQL 형태로 조그마한 사이트를 만들어볼까 했는데.. 좋은 자료 감사합니다..
관리의 유용성때문에 IBATIS를 많이써서 그런지 조금은 어색하네요..ㅎㅎ

48  384
 ryan            [2010-06-11]
Level 30 
 [EXP.36/50]
감사합니다...잘 보겠습니다~~~

'C#, .NET' 카테고리의 다른 글

분수(Fraction) 클래스 (자체제작)  (0) 2011.06.17
Invader  (0) 2011.06.17
LINQ  (0) 2011.06.17
Hive Simulator  (0) 2011.06.17
확장 메소드와 static class  (0) 2011.06.17
Posted by 휘사마
,