재우니의 블로그

 

visual studio 2015 로 웹 프로젝트를 생성하고 나서, ASP.NET Identity 부분의 데이터베이스 생성이 미리 web.config 에 초기값으로 기술되는데요.

 

우선 사용자 추가를 선택해서 넣어봤습니다. 넣기 전에 APP_DATA 에 MDB 파일이 존재하는지 확인해 봐야 하는데요.

처음엔 없답니다. 사용자를 추가하는 기능을 사용하게 되면 해당 MDB 가 미 존재시 생성되고 이를 활용하게 됩니다.

 

하지만,, 처음에 VS 에서 만든 접속 정보로 실행하면 오류가 발생됩니다.

 

1. 초기값

 

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20151026013916.mdf;Initial Catalog=aspnet-WebApplication3-20151026013916;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

 

 

아래와 같이 오류가 발생되더군요. app_data 폴더에 mdb 파일도 만들어지지 않고요.

 

SQL Server에 연결을 설정하는 중에 네트워크 관련 또는 인스턴스 관련 오류가 발생했습니다. 서버를 찾을 수 없거나 액세스할 수 없습니다. 인스턴스 이름이 올바르고 SQL Server가 원격 연결을 허용하도록 구성되어 있는지 확인하십시오. (provider: SQL Network Interfaces, error: 50 - Local Database Runtime 오류가 발생했습니다. The specified LocalDB instance does not exist.

 

줄 17:             var signInManager = Context.GetOwinContext().Get<ApplicationSignInManager>();
줄 18:             var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
줄 19:             IdentityResult result = manager.Create(user, Password.Text);
줄 20:             if (result.Succeeded)
줄 21:             {

 

 

2) 변경된 connectionString 정보

 

차이점은 별로 없습니다. v11.0 으로 변경한 것 뿐이고, 파일명은 랜덤 명이라 지저분해서 WebFormIdentity.mdf 로 수정해 봤습니다.

 

 

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\WebFormsIdentity.mdf;Initial Catalog=WebFormsIdentity;Integrated Security=True"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

 

인사를 추가하면 app_data 폴더에 mdf 파일이 생성되는것을 볼 수 있고요.

 

 

아래는 인사 생성 이후, 자동 인증된 화면입니다.

 

 

 

 

 

EntityFramework 의 Code First Migrations 을 하자.

 

먼저 이를 활성화 하기 위해 package nuget console 을 실행시킨다. 그리고 아래와 같이 실행한다.

 

enable-migrations
add-migration InitialCreate

 

 

enable-migrations 실행문은 프로젝트 내부에 Migration 이라는 폴더를 생성하며, 여기에 Configuration.cs 라는 파일도 생성해 준다. 해당 파일은 이를 Migation 할 환경을 변경할 수 있도록 하는 역할을 한다.

 

만약에 직접적으로 database 를 변경하고자 위의 단계를 잊어 버렸을 경우, Migration 은 존재하는 database 를 찾아주며, 자동적으로 add-migration 의 command 를 실행해준다. 그럼 ok 이다. 그리고 database 를 배포하기 전에 migration 코드를 실행하지 않았다.

이를 database 에 반영하기 위해선 update-database 의 command 를 실행하면 된다. 여러번 실행하면 데이터베이스에 존재하는지 체크하므로 여러번 발생하지 않는다.

 

 

이는 initializer class 와 비슷하다. Configuration 클래스는  Seed 메소드를 포함하고 있다.

 

 

internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

 

 

 

 

Seed 메소드의 목적은 database 필드를 생성 및 update 를 code first 로 실행한 후, 테스트 data 를 저장 및 update 하기 위한 함수이다.

이 메소드는 database 가 생성될때, 매번 데이터베이스 스키마가 변경될때마다 data model 이 변경된 후 호출하게 된다.

 

 

 

 

 

 

update-database

 

 

 

해당 메소드는 위의 seed 까지 기술 이후 이를 database 에 적용하는 것을 의미한다.