다음을 통해 공유


기본 저장 변경사항

DbContext.SaveChanges() 는 EF를 사용하여 데이터베이스에 변경 내용을 저장하는 두 가지 기술 중 하나입니다. 이 메서드를 사용하면 하나 이상의 추적된 변경 내용 (추가, 업데이트, 삭제)을 수행한 다음, 메서드를 SaveChanges 호출하여 해당 변경 내용을 적용합니다. 대안으로는 ExecuteUpdateExecuteDelete를 변경 추적기를 포함하지 않고 사용할 수 있습니다. 이 2가지 기술을 비교하며 소개하는 내용을 보려면 데이터 저장에서 개요 페이지를 참조하세요.

팁 (조언)

GitHub에서 이 문서의 샘플을 볼 수 있습니다.

데이터 추가

메서드를 DbSet<TEntity>.Add 사용하여 엔터티 클래스의 새 인스턴스를 추가합니다. 다음을 호출 DbContext.SaveChanges()하면 데이터가 데이터베이스에 삽입됩니다.

using (var context = new BloggingContext())
{
    var blog = new Blog { Url = "http://example.com" };
    context.Blogs.Add(blog);
    await context.SaveChangesAsync();
}

팁 (조언)

Add, Attach, 및 Update 메서드는 모두 관련 데이터 섹션에 설명된 대로 전달된 엔터티의 전체 그래프에서 작동합니다. 또는 EntityEntry.State 속성을 사용하여 단일 엔터티의 상태를 설정할 수 있습니다. 예: context.Entry(blog).State = EntityState.Modified.

데이터 업데이트

EF는 컨텍스트에서 추적하는 기존 엔터티에 대한 변경 내용을 자동으로 검색합니다. 여기에는 데이터베이스에서 로드/쿼리하는 엔터티와 이전에 데이터베이스에 추가되고 저장된 엔터티가 포함됩니다.

속성에 할당된 값을 수정한 다음, 다음을 호출 SaveChanges하기만 하면됩니다.

using (var context = new BloggingContext())
{
    var blog = await context.Blogs.SingleAsync(b => b.Url == "http://example.com");
    blog.Url = "http://example.com/blog";
    await context.SaveChangesAsync();
}

데이터 삭제

메서드를 DbSet<TEntity>.Remove 사용하여 엔터티 클래스의 인스턴스를 삭제합니다.

using (var context = new BloggingContext())
{
    var blog = await context.Blogs.SingleAsync(b => b.Url == "http://example.com/blog");
    context.Blogs.Remove(blog);
    await context.SaveChangesAsync();
}

데이터베이스 SaveChanges에 엔터티가 이미 있는 경우, 해당 객체는 삭제됩니다. 엔터티가 데이터베이스에 아직 저장되지 않은 경우(즉, 추가된 대로 추적됨) 컨텍스트에서 제거되고 호출될 때 SaveChanges 더 이상 삽입되지 않습니다.

단일 SaveChanges 호출에서 여러 작업 수행

여러 추가/업데이트/제거 작업을 단일 호출로 결합할 수 있습니다 SaveChanges.

using (var context = new BloggingContext())
{
    // seeding database
    context.Blogs.Add(new Blog { Url = "http://example.com/blog" });
    context.Blogs.Add(new Blog { Url = "http://example.com/another_blog" });
    await context.SaveChangesAsync();
}

using (var context = new BloggingContext())
{
    // add
    context.Blogs.Add(new Blog { Url = "http://example.com/blog_one" });
    context.Blogs.Add(new Blog { Url = "http://example.com/blog_two" });

    // update
    var firstBlog = await context.Blogs.FirstAsync();
    firstBlog.Url = "";

    // remove
    var lastBlog = await context.Blogs.OrderBy(e => e.BlogId).LastAsync();
    context.Blogs.Remove(lastBlog);

    await context.SaveChangesAsync();
}

비고

대부분의 데이터베이스 공급자는 SaveChanges를 사용하여 트랜잭션을 지원합니다. 즉, 모든 작업은 성공하거나 실패하며 작업이 부분적으로 적용된 상태로 남아있지 않습니다.