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 이 변경된 후 호출하게 된다.
해당 메소드는 위의 seed 까지 기술 이후 이를 database 에 적용하는 것을 의미한다.