레이블이 MVC인 게시물을 표시합니다. 모든 게시물 표시
레이블이 MVC인 게시물을 표시합니다. 모든 게시물 표시

2017년 6월 14일 수요일

C#, MVC : EntityFramework(DBContext) 로 테이블 생성시 Unique 컬럼 지정

일반적으로 유일키 값은 PK 로 지정하여 사용하고 EntityFramework 에선 Key 속성을 지정하여 설정한다.

하지만, PK 가 아닌 필드로 유일한 값을 가져야 할 필요가 있을수 있는데, DB 에선 Unique 를 설정하여 만들지만, EntityFramework 어떻게 할 까?


그냥 필드를 생성할때 "IsUnique" 를 "True" 로 설정하면 된다.


그럼 이렇게 자동으로 인덱스까지 생성해서 Unique 설정을 해준다.


만약 인덱스 명을 지정하고 싶으면, 인덱스 명을 같이 지정해 주면 지정한 인덱스 명으로 생성해 준다.

주의 할점은 인덱스를 생성할 경우 반드시 MaxLength 속성을 지정하여 필드 크기를 900 바이트 이하로 지정해야 인덱스가 생성되므로 주의 한다.

참고 : 테이블 '***' 에 있는 열 '***' 의 유형이 인덱스에서 키 열로 사용하기에 적합하지 않습니다


C#, MVC : EntityFramework(DBContext) 로 테이블 생성시 텍스트 필드 크기 지정하기


DbContext 로 데이터를 관리 할때, 일반적으로 텍스트 필드는 그냥 string 형식으로 지정하고 만든다. 그런데 이렇게 테이블을 생성하면...


이렇게 테이블의 컬럼 크기가 최대치로 잡혀 버린다.

varchar 특성상 최대 크기로 잡힌다고 딱히 문제가 있는것은 아니다. 하지만, 역시 무작정 최대 크기로 잡히는 것은 좀 맘에 안들기도 하고, 특히나 만약 저 텍스트 필드에 인덱스를 걸어야 할 일이 있을 경우 문제가 된다. (인덱스를 걸수 있는 필드 크기 최대치가 900 바이트 이기 때문. 크기가 varchar(900) 이상인 컬럼에는 인덱스를 걸수 없다.)

참고 : 테이블 '***' 에 있는 열 '***' 의 유형이 인덱스에서 키 열로 사용하기에 적합하지 않습니다

그렇다면 컬럼 크기를 지정하려면 어떻게 하면 될까?

간단히 "MaxLength" 속성을 지정해 주면 된다.
저렇게 MaxLength(128) 이렇게 지정해 주면...


컬럼 크기가 딱 저정도인 칼럼을 생성해 준다.


MVC, Bootstrap : 서브 메뉴 추가


참고 : 상단 메뉴 (네이게이션 바) 의 왼쪽에 메뉴 추가

기본적으로 제공하는 메뉴에는 1단계 메뉴만 등록되어 있는데, 여기에 서브 메뉴을 달아 보자.


일단 "_Layout.cshtml" 파일을 연다.


거기서 원하는 위치에 "dorpdown" 클래스를 지정한 "li" 항목을 달아 준다.
"dorpdown" 메뉴가 다른 메뉴와 다른 점은, <li> 와 <ul> 태그에 dropdown-toggle, dropdown, dropdown-menu 같은 스타일 시트 속성을 지정해준다는것이 다르다.

<ul class="nav navbar-nav">
<li>@Html.ActionLink("홈", "Index", "Home")</li>
<li>@Html.ActionLink("정보", "About", "Home")</li>
<li>@Html.ActionLink("연락처", "Contact", "Home")</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">커뮤니티 <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="#">공지사항</a></li>
<li class="divider"></li>
<li><a href="#">자유게시판</a></li>
<li><a href="#">건의사항</a></li>
<li><a href="#">방명록</a></li>
</ul>
</li>
</ul>
이렇게 하면 서브 메뉴가 등록된다.


참고로 각 메뉴간 구분자인 "<li class="divider"></li>" 를 사용했을 경우.


모바일 버젼에서 보면 저렇게 흰색으로 보이니 주의.
저걸 처리하는 방법은 다양하겠지만, 이 경우 가장 간단한 방법은 반응형으로 모바일 버젼일때 저 Devider 의 색을 바꿔 주는 것이다.



즉, "Content > Site.css" 파일에 특정 크기 이하일때 색을 바꿔주는 스타일 시트를 추가해 주면.

이렇게 별로 표가나지 않게 만들수 있다.

참고로, Bootstrap 에선 기본적으로 1단계 하위 메뉴까지만 지원하므로, 그 이하 단계 까지 하위 메뉴를 확장하고 싶을 경우 직접 구현하던가, 아니면 별도의 확장 모듈을 사용하여야 한다.

MVC, Bootstrap : 상단 메뉴 (네이게이션 바) 의 왼쪽에 메뉴 추가


참고 : MVC 웹 응용프로그램 생성 및 시작페이지 변경


MVC 사이트를 만들면 기본적으로 메뉴바가 생성되는데, 왼쪽 정렬로만 등록되어 있다.
이 경우 오른쪽에 별도의 메뉴를 추가로 등록하는 법. (어차피 Bootstrap 을 이용하므로 기본적으로 Bootstrap 사이트와 동일한 방식이다.)


일단 메뉴바는 "View > Shared > _Layout.cshtml" 에 있다.


여기에 메뉴를 추가해 주면 되는데, 별도로 "ul" 태그를 사용하고, "navbar-right" 스타일시트 클래스를 지정해 주면, 기존 메뉴와 구분되는 별도의 그룹으로 메뉴에 등록된다.


이렇게 기존 메뉴와는 별도로 오른쪽에 메뉴를 추가 할 수 있다.


하지만, 모바일 버젼으로 보일때는 왼쪽 메뉴 -> 오른쪽 메뉴 순으로 순차적으로 나열하는데, 순서는 맞지만 왼쪽메뉴와 오른쪽 메뉴가 구분되어 보이지 않으니, 왼쪽 메뉴와 오른쪽 메뉴의 성격이 다를 경우 주의 할 필요가 있다.

2017년 6월 7일 수요일

C#, MVC : in the application's configuration file does not contain the required providerName attribute

MVC 에서 DB 연결을 시도 했더니...

"in the application's configuration file does not contain the required providerName attribute"


... 라는 오류가 난다.

살짝 짜증이 나지만, 컴퓨터 잘못이 아니니, 일단 "Web.config" 를 열어본다.
아마 이런식으로 되어 있을 텐데...


여기에 "providerName" 이 빠져 있어서 그런것이다.
일반적으로 "System.Data.SqlClient" 를 사용하고 EntityFramework 를 사용할 때는 "System.Data.EntityClient" 를 사용한다고 하던데... 그냥 "System.Data.SqlClient" 만 써도 다 되는 것 같다.


하여간 "ConnectionStrings" 에 providerName="System.Data.SqlClient" 를 추가해 주면 오류가 해결된다.


C#, MVC : CS0246 'DbContext' 형식 또는 네임스페이스 이름을 찾을 수 없습니다.


MVC 에서 DB Context 를 사용하려고 하니...

"CS0246 'DbContext' 형식 또는 네임스페이스 이름을 찾을 수 없습니다."

... 라는 오류가 발생한다.

당연히 "using System.Data.Entity;" 가 되어 있는데도 안된다.
보통은 System.Data.Entity 만 Using 에 기록해줘도 되니, 안되면 당황스럽지만, 사실 System.Data.Entity 는 중요한게 아니다.

DbContext 를 사용하려면 "EntityFramework" 가 설치되어 있어야 한다.


NuGet 패키지 관리자에 가보니, 역시나 설치가 안되어 있다.
만약 설치가 되어 있다면, "제거" 나 "업데이트" 버튼이 나와 있었을 것이다.

이걸 설치를 하면...


이렇게 오류가 없어진다.

2017년 6월 1일 목요일

MVC : Windows Server 2008 에서 MVC 사이트를 만들었더니 "-2146232576 오류 코드 때문에 컴파일러가 실패했습니다." 오류가 발생한다.

이전에 ...

Windows Server 2008 에서 MVC 사이트를 만들었더니 403.14 - Forbidden 오류가 난다

... 로 Windows Server 2008 에서 MVC 사이트를 만들었더니 "-2146232576 오류" 가 발생했다.


일단 오류를 자세히 보자.
자세히 보면 만들어 놓은 MVC 사이트에서 뭔가를 실행하다 오류가 발생한 것을 볼수 있다.
(MVC 사이트 컴파일결과 생성된 파일이니, MVC 사이트의 bin 폴더에서 찾을 수 있다.)

저 파일을 한번 실행해 보면...


음... 드디어 저 오류의 정체를 찾아 냈다.
즉, .NetFramework 4.6 이 설치 되어 있지 않아 오류가 난것.

으... 그럼 애초에 사용 프레임 워크의 버젼을 4.5 정도로 낮추기만 해도 해결될 문제였단 말인가...

뭐... 이왕 여기까지 온거 저대로 해결을 해보자.

그냥 .NetFrameWork 4.6 을 설치해 주면 된다.
Window Update 로는 아마 설치가 안될테네... 직접 다운 받아 설치를 해 주자.


Microsoft .NET Framework 4.6(웹 설치 관리자) : https://www.microsoft.com/ko-kr/download/details.aspx?id=48130

이거 받아서 설치하면 됨.


그냥 동의하고 설치...


쭉쭉 설치가 되고... 이게 설치가 다 되면...


쨘~~ 이렇게 Windows Server 2008 에서도 MVC 사이트를 만들 수 있다.


MVC : Windows Server 2008 에서 MVC 사이트를 만들었더니 403.14 - Forbidden 오류가 난다


Windows Server 2008 에다 MVC 사이트를 만들었더니 오류가 난다.
워낙 오래전 OS 라 뭐... 당연한 일인가?

일단 .Net FrameWork 문제일수도 있으니, 프레임 워크를 다시 설치 해본다.


aspnet-regiis /i 혹은 aspnet-regiis /ir  

이렇게 프레임워크를 다시 설치를 해본다.
프레임워크 문제면 이렇게 하면 대부분 해결이 된다.
하지만, 이경우는 해결이 안돼었다.

403.14 - Forbidden 에러는 보통 기본문서가 등록되지 않았거나, 폴더 사용권한이 없을 경우 많이 발생하지만, 이경우는 MVC 니 그건 아닌것 같고, 좀더 근원적인 문제가 있는것 같다.

즉, MVC 자체를 인식못하는 경우.
"http://localhost/Home/Index" 같은 형태의 요청자체를 못받아 들이는 경우라고 할수 있다. 2008 Server 면 거의 10년전 OS 이니, 그럴수도 있지...

그러니, HotFix 를 설치해 준다.




특정 마침표로 끝나지 않은 Url 요청 처리기 : https://support.microsoft.com/ko-kr/help/980368/a-update-is-available-that-enables-certain-iis-7.0-or-iis-7.5-handlers-to-handle-requests-whose-urls-do-not-end-with-a-period

이 핫픽스를 설치해 주면 특정 파일이 지정되어 있지 않은 URL 도 인식한다.


이렇게 하면 오류가 바뀐다. (어쨌든 이전 오류는 해결 된셈)

ㅋㅋㅋ... 정말 못살겠구만...

이건...

Windows Server 2008 에서 MVC 사이트를 만들었더니 "-2146232576 오류 코드 때문에 컴파일러가 실패했습니다." 오류가 발생한다.

... 여기서 해결하면 된다.

2017년 5월 26일 금요일

C#, MVC, WebApp : EntityFramework 로 DB 연결 및 조회


참고 : C#, MVC, WebApp : MVC 웹 응용프로그램 생성 및 시작페이지 변경


 무슨 장점이 있는지는 모르겠으나, 요즘은 EntityFramework 로 DB 를 관리하는 경우가 많으니, 그냥 EntityFramework 로 해본다.

일단 "NuGet 패키지 관리" 를 실행.


여기서 "EntityFramework" 를 검색해서 설치한다.


그럼 참조에 "EntityFramework" 관련 항목이 추가된다.
일단 설치는 끝.


 이걸 사용하려면, 일단 폴더를 하나 생성해 주고.


여기서는 "DataContext" 라고 했지만, 아무거나 원하는대로 써도 됨.


여기다 클래슬 하나 추가해 준다.


이름은 적당히 알기 쉬운걸로...


그 클래스에 다른걸 별로 할것 없고, 그 클래스에 "DbContext" 를 상속 받게끔만 해주면 된다.

using System.Data.Entity;

namespace son10001.DataContext
{
    public class DBConnect : DbContext
    {
        public DBConnect() : base()
        {
        }
    }
}

이러면 DB 를 자동으로 연결해 주는데, 그래도 DB 연결 정보는 적어 줘야 접속이 된다.


DB 연결 정보는 "Web.config" 에 "<connectionStrings>" 항목으로 기록해 주면됨.
주의 할점은 <connectionStrings> 의 "name" 을 "DbContext" 클래스 명과 동일하게 지정해 주어야 한다는 것.

  <connectionStrings>
    <add name="DBconnect" connectionString="Data Source=192.168.0.100;Initial Catalog=Solution01;Persist Security Info=True;User ID=sa;Password=0000;" providerName="System.Data.SqlClient" />
  </connectionStrings>



DB 테이블은 이미 만들어 놓은 것을 쓴다.
여기서는 "Users" 테이블을 사용.


일단 테이블을 정의해 주어야 하니, "Models" 폴더에 클래스를 하나 추가해 준다.


이 클래스 명은 사용할 테이블명과 동일하게 주어야 함.



using System;
using System.ComponentModel.DataAnnotations;

namespace son10001.Models
{
    public class Users
    {
        [Key]
        public int UserNo { get; set; }

        [Required]
        public String UserId { get; set; }

        [Required]
        public String UserName { get; set; }

        [Required]
        public String UserPassword { get; set; }
    }
}

그리고 테이블 데이터셋과 동일하게 변수를 선언해 준다.
여기서 [Key] 는 기본키, [Required] 는 필수값. 즉, Not Null 을 의미한다.


using son10001.Models;
using System.Data.Entity;

namespace son10001.DataContext
{
    public class DBConnect : DbContext
    {
        public DBConnect() : base()
        {
        }

        public DbSet<Users> Users { get; set; }

    }
}

이제 테이블 설정을 만들어 놨으니, 이걸 DbContext 에 등록.
이렇게 함으로서 해당 테이블을 사용할 준비는 모두 끝났다.

이제 사용하기만 하면 됨.

이걸 사용하는 샘플.


var list = new List<Users>();
using (var db = new DBConnect())
{
    list = db.Users.ToList();
}

이전에 "Contact" 페이지를 기본 페이지로 지정했으니, 저기에다 데이터를 가져 오는 로직을 한번 추가해 보자.


이렇게 하고 실행하고, 저 지점에 중단점을 지정해서 놓고 가져온 값을 확인해 보면, DB 에서 현재 데이터를 잘 가져 왔음을 볼 수 있다.

참고로, DB Connect String 을 임의의 값으로 지정하는 법.


이렇게 <connectionStrings> 의 "Name" 을 임의의 값으로 지정했거나, <connectionStrings> 값 자체가 여러개 일경우. 즉, 테이트 서버와 운영서버의 연결값을 별도로 지정하여 사용한다던가 할때.... 저 값을 어떻게 지정해 줄수 있느냐? 하면...


그냥 DbContext 에서 base() 에 "name=연결문자열" 로 지정하면 간단히 지정 할 수 있다.
이렇게 하면 굳이 클래스명과 일치하지 않아도 쓸수 있음.