Programming/.NET

EntityFramework(엔티티프레임워크)를 간단하게 설명하면 기존의 애플리케이션이 DB데이터와 통신하기 위해 쿼리등을 통하여 데이터를 조회하고 저장하는 방식에서 발전해 DB의 각 테이블을 각각의 객체개념으로 매핑하여 객체의 내부요소(데이터)를 조회하거나 저장처리할 수 있도록 하는 개념입니다.

 

데이터를 객체화하여 다룰 수 있다는 것은 Visual Studio에서의 코딩이 가능하다는 것을 의미하고 이것은 인텔리센스기능지원이나 디버깅등에서의 작업능률 향상을 의미하기도 합니다.

 

엔티티프레임워크를 사용해 보기 전에 우선 대상이될 DB서버에 tmp라는 이름의 데이터베이스를 생성하고 user_list와 user_address라는 테이블을 만듭니다. 물론 테스트를 위해서는 적절한 데이터도 입력이 되어야 할것입니다.

 

 

다음으로 해당 테이블을 대상으로 엔티티 데이터모델을 생성하면 되는데 이를 위해 Visual Studio에서 Add New Item 대화상자를 열고 ADO.NET Entity Data Model 을 선택합니다. 예제에서 이름은 MyModel로 하였습니다.

 

 

다음 화면에서 EF Designer from database를 선택합니다.

 

 

다음버튼을 누른 후 New Connection 버튼을 눌러 DB연결을 설정합니다.

 

 

연결설정에서 적절한 서버와 계정을 입력하고 database로는 위에서 생성한 tmp을 선택합니다. 설정이 완료되면 'OK'버튼을 누릅니다.

 

 

설정이 완료되면 이전 화면에서의 콤보박스에 연결항목이 나타날 것입니다. 참고로 선택된 'Yes, include the sensitive data in the connection string' 항목은 비번과 같은 민감한 데이터를 연결문자열에 표시하도록 한 것입니다. 보안성이 요구되면 'No'항목을 선택하고 코드단에서 보안에 필요한 내용을 직접 처리해야 합니다.

 

 

다음 버튼을 누르면 해당 DB에서 선택가능한 항목(테이블, 프로시저등)이 표시됩니다. 모델링할 대상을 선택하고 '끝내기'버튼을 누르십시오.

 

 

위와 같은 단계를 거치고 나면 edmx 파일이 생성될 것입니다. 이것만으로 사용준비가 완료된것입니다. 이제 빈페이지 하나를 생성하고 실제 만들어진 Entity객체를 통해 데이터를 가져와 보겠습니다.

 

<body>

    <form id="form1" runat="server">
    <div>

        <asp:GridView ID="GridView1" runat="server"></asp:GridView>
    </div>
    </form>
</body>

 

우선 페이지에 GridView 컨트롤을 배치하고

 

protected void Page_Load(object sender, EventArgs e)
{
    tmpEntities te = new tmpEntities();

    GridView1.DataSource = te.user_list.ToList();
    GridView1.DataBind();
}

 

엔티티 데이터모델 객체를 통해 user_list 테이블에 있는 데이터를 모두 가져오도록 하였습니다. 이 데이터모델은 web.config(응용프로그램 이라면 App.config)에 있는 연결문자열정보를 통해 DB서버에 연결되어 데이터를 가져오게 됩니다.

 

예제에서는 user_list 테이블의 모든 데이터를 가져와 GridView에 뿌렸는데 edmx에서 테이블을 상속하는 방법으로 특정 데이터를 분리된 테이블로 구분할 수 있습니다. 예를 들어 user_age인 값이 30인것과 40인것을 구별하여 테이블을 분리해 관리할 수 있는 것입니다.

 

edmx를 열어 마우스 우클릭을 하고 Add New -> Entity항목을 차례로 선택합니다.

 

 

Base_type을 user_list로 선택하여 지금 생성하려는 Entity가 기존 user_list에서 상속받도록 합니다. 이름은 entity_user_list로 하였습니다.

 

해당 절차를 마치고 나면 다음과 같은 화면이 보여질 것입니다.

 

 

user_list 개체를 선택해 마우스 우클릭을 하여 'Table Mapping'항목을 선택합니다.

 

 

Mapping Detail에서 위 화면과 같이 Maps to user_list 하위에 When user_age를 생성하고 값을 30으로 입력합니다. 이렇게 되면 이제 user_age가 30인 것은 user_list 객체가 됩니다.

 

 

조금전 생성한 entity_user_list에도 같은 작업을 수행하는데 이번에는 값을 40으로 입력합니다. 이제 user_age가 40인 것은 entity_user_list가 됩니다.

 

tmpEntities te = new tmpEntities();

var user_list = (from age in te.user_list
                where age is entity_user_list
                select new { age.user_name, age.user_phone }).ToList();

GridView1.DataSource = user_list;
GridView1.DataBind();

 

 

코드를 수정하여 user_list에서 user_age가 entity_user_list와 같은 것으로만 데이터를 가져오도록 하였습니다. 새로운 entity는 위와 같이 작업이 가능합니다.

 

Entity모델링은 테이블뿐만 아니라 프로시저(Procedure)를 대상으로 할 수도 있습니다. 이를 테스트해 보기 위해 다음과 같은 임의의 프로시저를 하나 생성합니다.

 

-----------------------------------------

CREATE PROCEDURE GET_USER_LIST
AS
BEGIN
 SET NOCOUNT ON;

 SELECT *
 FROM user_list;
END
GO

-----------------------------------------

 

그런 후 edmx에서 마우스 우클릭하여 'Update Model from Database'를 선택하고 방금 추가한 GET_USER_LIST 프로시저 항목을 체크한 뒤 '완료'버튼을 누릅니다.

 

 

하지만 edmx에는 아무것도 나오지 않는데 대신 마우스 우클릭하여 'Model Browser'를 선택하면 해당 해당 View에서 추가된 프로시저 항목을 볼 수 있습니다.

 

 

따라서 저장프로시저는 테이블과 달리 변경가능한 Entity로 제공되지 않습니다. 그러나 코드에서 불러와 작업하는데는 아무런 영향이 없습니다.

 

tmpEntities te = new tmpEntities();

var user_list = te.GET_USER_LIST();

GridView1.DataSource = user_list;
GridView1.DataBind();

 

 

코드에서 일일이 Entity모델을 다루는 것조차 귀찮다면 아예 테이블이나 프로시저를 DataSource객체로 만들어 디자인단에서 컨트롤에 바로 전달할 수도 있습니다.

 

이렇게 하려면 우선 aspx 파일에서 GridView 컨트롤 밑에 EntityDataSource컨트롤을 배치합니다.

 

<form id="form1" runat="server">
<div>
    <asp:GridView ID="GridView1" runat="server"></asp:GridView>
    <asp:EntityDataSource ID="EntityDataSource1" runat="server"></asp:EntityDataSource>
</div>
</form>

 

페이지를 디자인화면으로 전환해 EntityDataSource 컨트롤의 스마트태그를 클릭하여 'Configure Data Source'를 선택합니다.

 

 

Named Connection에 기존에 추가한 데이터모델인 tmpEntities를 선택하고 DefaultContainerName에도 같은걸 선택한 후 'Next'버튼을 누릅니다.

 

 

 

EntitySetName에 데이터소르로 가져올 모델을 선택합니다. 필요에 따라 Choose the proerties in the query result 부분에 표시할 열을 추가하거나 데이터의 삽입, 삭제, 업데이트를 위한 활성화여부를 지정할 수 있습니다.

 

이제 EntityDataSource를 설정을 모두 마쳤습니다. 다음으로 aspx페이지에서 GridView컨트롤의 DataSourceID속성을 EntityDataSource ID로 설정하면 GridView와 EntityDataSource와의 연결이 이루어지게 됩니다.

 

<form id="form1" runat="server">
<div>
    <asp:GridView ID="GridView1" runat="server" DataSourceID="EntityDataSource1">

</asp:GridView>
    <asp:EntityDataSource ID="EntityDataSource1" runat="server" 

ConnectionString="name=tmpEntities" DefaultContainerName="tmpEntities" 

EnableFlattening="False" EntitySetName="user_list">

</asp:EntityDataSource>
</div>
</form>

 

참고로 EntityDataSource를 설정할때 마법사기능은 2016년6월 현재 EntityFramework 5.0에서만 가능합니다. 따라서 이보다 높은 버전을 사용하는 경우 속성을 직접 추가하는 방법으로 EntityDataSource컨트롤을 설정해야 합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] LoginName  (0) 2017.03.28
[ASP.NET] 세션(Session)  (0) 2017.03.21
[ASP.NET] EntityFramework(엔티티프레임워크)  (0) 2017.03.14
[ASP.NET] 설정파일 - 2  (0) 2017.03.06
[ASP.NET] 서버 컨트롤 - 8 (디자인)  (0) 2017.03.03
[ASP.NET] 서버 컨트롤 - 7 (형변환)  (0) 2017.02.22
0 0