Entity Framework
Entity-Framework 코드 첫 마이그레이션
수색…
마이그레이션 사용
엔티티 프레임 워크에서 코드 첫 마이그레이션을 사용하려면 다음 명령을 사용하십시오.
Enable-Migrations
패키지 관리자 콘솔에서 .
EF가 관리하는 데이터베이스 개체를 포함하는 유효한 DbContext
구현이 필요합니다. 이 예제에서 데이터베이스 컨텍스트에는 객체 BlogPost
및 Author
가 포함됩니다.
internal class DatabaseContext: DbContext
{
public DbSet<Author> Authors { get; set; }
public DbSet<BlogPost> BlogPosts { get; set; }
}
명령을 실행하면 다음과 같은 결과가 나타납니다.
PM> Enable-Migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project <YourProjectName>.
PM>
또한 새로운 폴더 Migrations
은 하나의 Configuration.cs
파일 안에 있어야합니다.
다음 단계는 초기 데이터베이스를 작성할 첫 번째 데이터베이스 이주 스크립트를 작성하는 것입니다 (다음 예 참조).
첫 번째 마이그레이션 추가
마이그레이션을 활성화 한 후에 ( 이 예제 를 참조하십시오) 모든 데이터베이스 테이블, 색인 및 연결의 초기 생성을 포함하는 첫 번째 마이그레이션을 만들 수 있습니다.
다음 명령을 사용하여 마이그레이션을 생성 할 수 있습니다.
Add-Migration <migration-name>
이 명령은 이주를 적용하고 제거하는 데 사용되는 두 가지 메소드 Up
및 Down
을 포함하는 새 클래스를 작성합니다.
이제 위의 예제에 따라 명령을 적용하여 Initial 라는 마이그레이션을 만듭니다.
PM> Add-Migration Initial
Scaffolding migration 'Initial'.
The Designer Code for this migration file includes a snapshot of your current Code
First model. This snapshot is used to calculate the changes to your model when you
scaffold the next migration. If you make additional changes to your model that you
want to include in this migration, then you can re-scaffold it by running
'Add-Migration Initial' again.
새로운 파일 타임 스탬프 _Initial.cs가 생성됩니다 (여기서는 중요한 내용 만 표시됩니다).
public override void Up()
{
CreateTable(
"dbo.Authors",
c => new
{
AuthorId = c.Int(nullable: false, identity: true),
Name = c.String(maxLength: 128),
})
.PrimaryKey(t => t.AuthorId);
CreateTable(
"dbo.BlogPosts",
c => new
{
Id = c.Int(nullable: false, identity: true),
Title = c.String(nullable: false, maxLength: 128),
Message = c.String(),
Author_AuthorId = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Authors", t => t.Author_AuthorId)
.Index(t => t.Author_AuthorId);
}
public override void Down()
{
DropForeignKey("dbo.BlogPosts", "Author_AuthorId", "dbo.Authors");
DropIndex("dbo.BlogPosts", new[] { "Author_AuthorId" });
DropTable("dbo.BlogPosts");
DropTable("dbo.Authors");
}
보시다시피 Up()
메서드에서 Authors
및 BlogPosts
라는 두 테이블이 만들어지고 그에 따라 필드가 만들어집니다. 또한 두 테이블 간의 관계는 Author_AuthorId
필드를 추가하여 만들어 Author_AuthorId
. 다른면에서 Down()
메소드는 마이그레이션 활동을 되돌리려 고 시도합니다.
마이그레이션에 확신이 있다면 다음 명령을 사용하여 데이터베이스에 마이그레이션을 적용 할 수 있습니다.
Update-Database
모든 보류중인 마이그레이션 (이 경우 Initial -migration)이 데이터베이스에 적용된 후 seed 메소드가 적용됩니다 (적절한 예)
PM> update-database
Specify the '-Verbose' flag to view the SQL statements being applied to the target
database.
Applying explicit migrations: [201609302203541_Initial].
Applying explicit migration: 201609302203541_Initial.
Running Seed method.
Add-Migration
및 Update-Database
명령의 경우 활동을 조정하는 데 사용할 수있는 몇 가지 옵션을 사용할 수 있습니다. 모든 옵션을 보려면 사용하십시오
get-help Add-Migration
과
get-help Update-Database
마이그레이션 중 시드 데이터
마이그레이션을 활성화하고 생성 한 후에는 데이터베이스의 데이터를 처음으로 채우거나 마이그레이션해야 할 수 있습니다. 여러 가지 가능성이 있지만 간단한 마이그레이션의 경우 enable-migrations
호출 한 후 구성 파일에서 'Seed ()'메서드를 사용할 수 있습니다.
Seed()
함수는 데이터베이스 컨텍스트를 매개 변수로 가져오고이 함수 내에서 EF 연산을 수행 할 수 있습니다.
protected override void Seed(Model.DatabaseContext context);
Seed()
내에서 모든 유형의 활동을 수행 할 수 있습니다. 오류가 발생하면 전체 트랜잭션 (적용된 패치 포함)이 롤백됩니다.
테이블이 비어있는 경우에만 데이터를 만드는 예제 함수는 다음과 같습니다.
protected override void Seed(Model.DatabaseContext context)
{
if (!context.Customers.Any()) {
Customer c = new Customer{ Id = 1, Name = "Demo" };
context.Customers.Add(c);
context.SaveData();
}
}
EF 개발자가 제공하는 멋진 기능은 확장 메소드 AddOrUpdate()
입니다. 이 방법을 사용하면 기본 키를 기반으로 데이터를 업데이트하거나 이미 존재하지 않는 데이터를 삽입 할 수 있습니다 (예제는 생성 된 Configuration.cs 소스 코드에서 가져온 것입니다).
protected override void Seed(Model.DatabaseContext context)
{
context.People.AddOrUpdate(
p => p.FullName,
new Person { FullName = "Andrew Peters" },
new Person { FullName = "Brice Lambson" },
new Person { FullName = "Rowan Miller" }
);
}
마지막 패치가 적용된 후에
Seed()
가 호출된다는 점에 유의하십시오. 패치 중 데이터를 마이그레이션하거나 시드해야하는 경우 다른 접근 방법을 사용해야합니다.
마이그레이션 중에 Sql () 사용
예 : 기존 열을 필요없는 열에서 필수 열로 마이그레이션하려고합니다. 이 경우 변경된 필드가 실제로 NULL
행에 대해 이주에서 일부 기본값을 채워야 할 수도 있습니다. 기본값이 단순한 경우 (예 : "0") 열 정의에서 default
또는 defaultSql
속성을 사용할 수 있습니다. 그렇게 쉬운 일이 아니므로 마이그레이션의 Up()
또는 Down()
멤버 함수에서 Sql()
함수를 사용할 수 있습니다.
여기에 예제가 있습니다. 전자 메일 주소를 데이터 집합의 일부로 포함하는 클래스 작성자 를 가정합니다. 이제 이메일 주소를 필수 입력란으로 사용하기로 결정했습니다. 기존 열을 마이그레이션하기 위해 [email protected]
과 같은 거짓 이메일 주소를 만드는 것이 현명 합니다. 전체 이름은 공백없이 작성자의 전체 이름입니다. Email
필드에 [Required]
속성을 추가하면 다음과 같은 마이그레이션이 생성됩니다.
public partial class AuthorsEmailRequired : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Authors", "Email", c => c.String(nullable: false, maxLength: 512));
}
public override void Down()
{
AlterColumn("dbo.Authors", "Email", c => c.String(maxLength: 512));
}
}
일부 NULL 필드가 데이터베이스 내에있는 경우 실패합니다.
'Email'열에 NULL 값을 삽입 할 수 없습니다. 'App.Model.DatabaseContext.dbo.Authors'테이블; 열이 널을 허용하지 않습니다. UPDATE가 실패합니다.
AlterColumn
명령을 사용 하기 전에 아래와 같이 추가하면 도움이됩니다.
Sql(@"Update dbo.Authors
set Email = REPLACE(name, ' ', '') + N'@example.com'
where Email is null");
update-database
호출이 성공하고 테이블이 다음과 같이 보입니다 (예제 데이터가 표시됨).
기타 용도
데이터베이스의 모든 유형의 DML 및 DDL 활동에 대해 Sql()
함수를 사용할 수 있습니다. 마이그레이션 트랜잭션의 일부로 실행됩니다. SQL이 실패하면 완료 마이그레이션이 실패하고 롤백이 완료됩니다.
코드에서 "Update-Database"하기
비 개발 환경에서 실행되는 응용 프로그램은 종종 데이터베이스 업데이트가 필요합니다. Add-Migration
명령을 사용하여 데이터베이스 패치를 만든 후에는 다른 환경에서 업데이트를 실행 한 다음 테스트 환경을 실행해야합니다.
일반적으로 직면 한 문제는 다음과 같습니다.
- 프로덕션 환경에 Visual Studio가 설치되어 있지 않습니다.
- 실생활에서 연결 / 고객 환경에 연결할 수 없습니다.
해결 방법은 수행 할 업데이트를 확인하고 순서대로 실행하는 다음 코드 시퀀스입니다. 오류가 발생해도 데이터가 손실되지 않도록 적절한 트랜잭션 및 예외 처리를 확인하십시오.
void UpdateDatabase(MyDbConfiguration configuration) {
DbMigrator dbMigrator = new DbMigrator( configuration);
if ( dbMigrator.GetPendingMigrations().Any() )
{
// there are pending migrations run the migration job
dbMigrator.Update();
}
}
여기서 MyDbConfiguration
은 소스의 어딘가에서 마이그레이션 설정입니다.
public class MyDbConfiguration : DbMigrationsConfiguration<ApplicationDbContext>
초기 엔티티 프레임 워크 코드 처음 마이그레이션 단계별
- 콘솔 응용 프로그램을 만듭니다.
- "패키지 관리자 콘솔"에서
Install-Package EntityFramework
를 실행하여 EntityFramework nuget 패키지를Install-Package EntityFramework
- app.config 파일에 연결 문자열을 추가하십시오. 연결에
providerName="System.Data.SqlClient"
를 포함시키는 것이 중요합니다. - 원하는대로 "
Blog
"와 같은 공개 클래스를 만듭니다. - DbContext에서 상속받은 ContextClass를 생성하십시오. "
BlogContext
" - DbSet 유형의 컨텍스트에서 속성을 정의하십시오.
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
}
public class BlogContext: DbContext
{
public BlogContext(): base("name=Your_Connection_Name")
{
}
public virtual DbSet<Blog> Blogs{ get; set; }
}
- 생성자 (여기서 Your_Connection_Name)에 연결 이름을 전달하는 것이 중요합니다.
- 패키지 관리자 콘솔에서
Enable-Migration
명령을 실행하면 프로젝트에 마이그레이션 폴더가 생성됩니다. -
Add-Migration Your_Arbitrary_Migraiton_Name
명령을 실행Add-Migration Your_Arbitrary_Migraiton_Name
Up () 및 Down () 두 가지 방법으로 마이그레이션 폴더에 마이그레이션 클래스가 만들어집니다. - 블로그 테이블이있는 데이터베이스를 만들려면
Update-Database
명령을 실행하십시오.