ASP.NET MVC - Model(1)

이번 포스팅은 모델에 대해서 알아보도록 하겠습니다. 어서 시작하죠^^

엔티티 프레임워크로 모델 클래스 생성하기

Microsoft Entity Framework는 O/RM 툴로서 자동으로 데이터베이스의 데이터 접근 계층을 생성해줍니다. 음.. 그러니까 데이터 액세스를 하는 클래스를 생성하는데 힘을 뺄 필요가 없게하는거죠.
일단, 간단한 어플리케이션 개발을 통해 알아가보도록 하시죠~

TelDir 데이터베이스 만들기

제 포스트 중 ASP.NET MVC - View(3) 를 참고하셔서 우선 만드시죠. 그때는 뷰에 중점을 뒀기 때문에 정말 그냥 보여주는 것까지만 해봤고요, 지금 시간은 그 이후에 작업을 해볼겁니다. insert, update, delete 작업이요. select는 해봤고요. ㅎㅎ
디비 생성을 마치셨으면 TestDB가 생성되었고, TelDirDBModel 모델이 생성되었고, 고로 TelDir 이라는 엔티티가 생성되었겠죠? 여기서 잠깐, 디자이너 클래스 파일은 건들지 마세요!!
TelDirDBModel.Designer.cs 파일은 그냥 두시고 이 모델 클래스를 확장하고 싶으면 별도의 파샬클래스를 생성한후 하도록 하죠.

먼저 인덱스 페이지 부터 띄우도록 하죠.


HomeController 의 인덱스 페이지를 띄우는 소스는 다음과 같죠. 지난 포스팅에서 해봤습니다.
설명은 불필요~


HomeController.cs - Index() 입니다. 생성자를 두어 모델 객체를 생성했고, Index 메쏘드에서는 TelDir의 리스트를 가져오는거죠.
위 소스에서 처럼 _db.TelDirSet.ToList()의 _db.TelDirSet은 TelDir테이블을 가리키고, ToList()는 그 모든 데이터를 TelDir 컬렉션(List<TelDir>) 으로 반환하게 됩니다.
뷰페이지 소스는 다음과 같은데, 중요한건!!

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcModelTest1.Models.TelDir>>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Index</h2>
    <table>
        <tr>
            <th></th>           
            <th>
                NAME
            </th>
            <th>
                PHONE
            </th>
            <th>
                WDATE
            </th>
        </tr>
    <% foreach (var item in Model) { %>
        <tr>
            <td>
                <%= Html.ActionLink("Edit", "Edit", new { id=item.ID }) %> |
                <%= Html.ActionLink("Delete", "Delete", new { id = item.ID })%>
            </td>          
            <td>
                <%:item.NAME %>
            </td>
            <td>
                <%:item.PHONE %>
            </td>
            <td>
                <%:String.Format("{0:g}", item.WDATE) %>
            </td>
        </tr>
    <% } %>
    </table>
    <p>
        <%= Html.ActionLink("Add Phone", "Add") %>
    </p>
</asp:Content>


형식화된 뷰라는 거죠. Inherits 속성에 보면 System.Web.Mvc.ViewPage<IEnumerable<MvcApplication1.Models.TelDir>> 이렇게 되어있죠?
이렇게 되야 IEnumerable한 모델객체에 접근이 가능하게 되는거죠.

자. 이제 주소록 추가!

엔티티 프레임워크에서는 인서트 작업을 어떻게 하는지 알아보죠. 자~ 이제 디비에 주소록 데이터를 인서트하겠습니다. HomeController에 액션을 추가합니다.


처음에는 파라미터로 FormCollection 으로 데이터를 받으려 했지만, 잘 되지 않더군요. 여기를 보시면 그 이유를 아실 수 있습니다. 아흑.
그래서 지금 주석으로 되어있는 부분들을 하지 못했습니다. TryUpdateModel 에서 form 객체를 받는데 받을수 없기에 주석. 그 아래 validation 부분은 submit 시에 entity 모델(TelDirDB.Designer.cs)을 먼저 거치더라고요. 이런. 쓸모가 없었습니다. 그래서 주석! 더 공부하면 알게되겠죠. 그 진실을~
이제 소스를 보시면, submit시에 TelDir 객체를 생성해서 넘겨받은 값을 세팅하고

_db.AddToTelDirSet(telToAdd);
_db.SaveChanges();


추가하고, 세이브~ 앗싸~ SaveChanges() 잊지마세요~
여기서 잠깐! 시간값이 0001-01-01 의 이상야릇한 디폴트값이 세팅된다면 여기를 보세요.

추가가 잘 되었으니 이제는 업데이트!

엔티티 프레임워크에서는 업데이트를 어떻게 하나? 뭐 별거 있겠습니까? 인서트 작업이랑 비슷하겠죠. 소스를 보시면.


처음 Edit 메쏟가 호출되면 파라미터로 받은 id 로  LINQ to Entities를 사용해서 TelDir의 한 행을 가져오고 그 값을 모델에 세팅해서 뷰에 렌더링하게되죠. submit은 Add 때와 별 차이가 없습니다. id로 업데이트할 행을 가져오는 것뿐, 나머지는 같습니다.
Edit 뷰소스를 공개합니다. ㅎㅎ

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcModelTest1.Models.TelDir>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Edit
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Edit</h2>
    <% using (Html.BeginForm()) {%>
        <fieldset>
            <legend>Fields</legend>
            <%= Html.HiddenFor(model => model.ID) %>
            <p>
                이름 : <%= Html.TextBoxFor(model => model.NAME)%>
                       <%= Html.ValidationMessageFor(model => model.NAME)%>
            </p>
            <p>
                전화번호 : <%= Html.TextBoxFor(model => model.PHONE) %>
                          <%= Html.ValidationMessageFor(model => model.PHONE) %>
            </p>
            <p>
                <input type="submit" value="Edit Phone" />
            </p>
        </fieldset>
    <% } %>
    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>
</asp:Content>


ID를 히든필드에 입력하는 것( <%= Html.HiddenFor(model => model.ID) %> ) 외에는 Add의 뷰소스와 동일합니다.

이제 마지막, 삭제

엔티티 프레임워크의 마지막 미션~ 삭제부분이 남았습니다. 가장 심플하죠. 하지만 전, 작업하면서 디비의 데이터를 직접적으로 삭제한 적이 거의 없어서리. 항상 필드값(delYn..)을 두고 업데이트했죠. 암튼 하는 방법은 간단합니다.


id로 삭제할 행을 가져오고, DeleteObject를 통해 삭제를 한다. 마지막은 항상 세이브~

휴~ 엔티티 프레임워크에서의 작업은 이로써 모두 끝이났습니다. select, insert, update, delete 이제 못하는게 없네요. ㅎㅎ 다음 포스팅은 LINQ to SQL 과 함께하는 모델클래스 생성기.. 에 대해서 나눠보도록 하겠습니다.

참고 : http://www.asp.net/learn/mvc/tutorial-16-cs.aspx

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

ASP.NET MVC - Validation(1)  (0) 2010.05.24
ASP.NET MVC - Model(2)  (4) 2010.04.04
ASP.NET MVC - View(4)  (0) 2009.12.11
ASP.NET MVC - View(3)  (0) 2009.12.02
ASP.NET MVC - View(2)  (0) 2009.11.30