(26)ASP.NETコアEF保存(セーブ基本、セーブデータ、カスケード削除、利用のトランザクション)

1.はじめに

各コンテキストのインスタンスは、追跡変更がデータベースに書き込む必要のために責任があるChangeTrackerを持っています。あなたはエンティティインスタンスのタイプを変更すると、これらの変更はChangeTrackerに記録されている、とあなたが呼び出すときにSaveChangesメソッドは、データベースに書き込まれます。このデータベースプロバイダは、(例えば、リレーショナルデータベース、UPDATE、およびDELETEコマンドを挿入)データベースの操作に特定の変更を変換する責任があります。

2.基本的な保存

追加、変更、削除データコンテキストとエンティティクラスを使用する方法を学びます。

2.1データの追加

DbSet.Addメソッドを使用してエンティティクラスの新しいインスタンスを追加します。あなたはSaveChangesメソッドを呼び出すと、データがデータベースに挿入されます。

使用VARのコンテキスト= 新しいBloggingContext())
{ 
    VARのブログ= 新しいブログのURL {= " http://sample.com " }。
    context.Blogs.Add(ブログ)。
    context.SaveChanges(); 
}

2.2アップデートデータ

EFは、自動的にコンテキストによって追跡され、既存のエンティティへの変更を検出します。これは、データベースクエリからロードされたエンティティだけでなく、アドオンや実体保存する前にデータベースに含まれます。単純に変更する属性を割り当てることで、その後、コールSaveChangesメソッドをすることができます。

使用VARのコンテキスト= 新しいBloggingContext())
{ 
    VARのブログ= context.Blogs.First()。
    blog.Url = " http://sample.com/blog " 
    context.SaveChanges(); 
}

削除データへ2.3

エンティティクラスのインスタンスを削除するDbSet.Remove方法を使用します。エンティティがデータベースにすでに存在する場合は、その後のSaveChanges時にエンティティを削除します。エンティティがデータベースに保存されていない場合は、SaveChangesメソッドを呼び出すときに、エンティティは、コンテキストから削除され、もはや挿入されていない、(すなわち、追跡が「追加」です)。

使用VARのコンテキスト= 新しいBloggingContext())
{ 
    VARのブログ= context.Blogs.First()。
    context.Blogs.Remove(ブログ)。
    context.SaveChanges(); 
}

2.4単一のSaveChangesにおける複数の動作

より多くのあなたは、SaveChangesメソッドへの単一の呼び出しに/更新/削除操作を追加することができます。

使用VARのコンテキスト= 新しいBloggingContext())
{ 
    // 追加 
    context.Blogs.Addを(新しいブログのURL {= " http://sample.com/blog_one " })。
    context.Blogs.Add(新しいブログのURL {= " http://sample.com/blog_two " })。
    // 更新
    VAR firstBlog = context.Blogs.First(); 
    firstBlog.Url = "" ;
    // 削除
    VAR lastBlog = context.Blogs.Last(); 
    context.Blogs.Remove(lastBlog)。
    context.SaveChanges(); 
}

3.保存したデータリンク

独立したエンティティだけでなく、モデルに定義された関係に加えて使用することができます。

3.1関連するデータを追加

あなたはまた、複数の新たな関連エンティティを作成するために、他のエンティティを追加する場合の一つは、コンテキストに追加されます。次の例では、ブログと3つのすべての関連する記事はデータベースに挿入されます。見つけ、彼らは、ナビゲーションプロパティBlog.Postsを介してアクセスすることができるので、これらの記事を追加します。

使用してVARのコンテキスト= 新しいBloggingContext())
{ 
    VARのブログ= 新しいブログ
    { 
        のUrl = " http://blogs.msdn.com/dotnet " 
        投稿 = 新しいリスト<ポスト> 
        { 
            新しいポスト{タイトル= " イントロC#へ" }、
             新しいポスト{タイトル= " VB.NET入門" }、
             新しいポスト{タイトル= " イントロF#に" } 
        }
    }。
    context.Blogs.Add(ブログ)。
    context.SaveChanges(); 
}

3.2関連するエンティティを追加します

エンティティの新しいエンティティナビゲーションコンテキスト属性からの基準が追跡されている場合、エンティティが見出され、データベースに挿入されます。次の例では、実体として挿入ポストエンティティは、エンティティがデータベースから抽出された属性のブログの記事に追加されます。

使用VARのコンテキスト= 新しいBloggingContext())
{ 
    VARのブログ= context.Blogs.Include(B => b.Posts)1次回を();
    VaRのポスト= 新しいポスト{タイトル= EFコア入門}; 
    blog.Posts.Add(ポスト)。
    context.SaveChanges(); 
}

関係を変更3.3

あなたは、エンティティのナビゲーション属性を変更する場合は、データベース内の外部キーは、対応する列を変更します。次の例では、ポイントのナビゲーションブログのブログに、そのプロパティの新しいブログのエンティティを投稿するに属するエンティティを更新する、それがポストトラックナビゲーションプロパティのコンテキストであるので、ブログは、データベースに挿入される新しいエンティティを引用されていますエンティティ。

使用VARのコンテキスト= 新しい新しいBloggingContext())
{ 
    // エンティティボディ追加
    するvarブログ= 新しい新しいブログのURL = { " http://blogs.msdn.com/visualstudio " };
     VAR POST = context.Posts.First( );
     // POSTは、リレーショナル更新 
    post.Blogを= ブログ; 
    context.SaveChanges(); 
}

4.カスケード削除

削除動作DeleteBehavior列挙型の定義、および制御OnDelete流暢APIに送信することができる:
●子/依存削除することができます
●子の外部キー値がnullに設定することができる
●子供変わらない
例:

VaRのブログ= context.Blogs.Include(B => b.Posts)1次回();
VaRのポスト= blog.Posts.ToList(); 
DumpEntities(  ロード後のエンティティ:、コンテキスト、ブログ、記事)。
context.Remove(ブログ)。
DumpEntities($ "   ブログを削除した後に'{blog.BlogId}':" 、コンテキスト、ブログ、ポスト)。
試す
{ 
    Console.WriteLineを()。
    Console.WriteLineを("   変更を保存:" ); 
    context.SaveChanges(); 
    DumpSql(); 
    (DumpEntities "   のSaveChanges後:" 、コンテキスト、ブログ、記事)。
} 
キャッチ(例外e)
{ 
    DumpSql()。
    Console.WriteLineを(); 
    Console.WriteLineを($ "   のSaveChanges投げた{。e.GetType()名}:{(eはDbUpdateException e.InnerException.Messageです:?e.Message)} " ); 
}

レコードの結果:

ロード実体後:
    ブログ1  である 状態と変わらず2件の参照記事。
      ポスト1  である 状態FKと変わらず1 とブログを参照する1 
      ポスト2  である 状態FKと変わらず1 とブログを参照する1 

  ブログを削除した後、1 
    ブログ1  である して状態が削除2件の参照記事。
      ポスト1  である 状態FKと変わらず1 とブログを参照する1 
      ポスト2  である 状態FKと変わらず1 とブログを参照する1 

  保存の変更:
    [投稿]から、削除[PostId] = 1
    [投稿]から、削除WHERE [PostId] = 2 
    [ブログ] [のblogid]から、削除 = 1 

  のSaveChanges後:
    ブログ' 1 '  である してデタッチ状態2件の参照記事。
      ポスト1  である  FKでデタッチ状態1 とブログへの参照。
      ポスト2  である  FKでデタッチ状態1 とブログへの参照。

5.トランザクション

トランザクションのアトミック・プロセスは、データベースの複数の動作を可能にします。トランザクションがコミットされている場合は、すべての操作が正常にデータベースに適用されます。トランザクションがロールバックされている場合は、すべての操作がデータベースに適用されません。

5.1制御トランザクション

DbContext.Database APIは、開始、コミットやロールバックトランザクションのために使用することができます。例えばショー2 LINQクエリのSaveChanges()操作の後、単一のトランザクションで実行されます。いないすべてのデータベースは、アプリケーションがトランザクションをサポートしています。あなたは、トランザクションAPIを呼び出すと、いくつかのアプリケーションを提供すると、例外をスローまたは何もしないことがあります。

使用してVARのコンテキスト= 新しいBloggingContext())
{ 
    使用してVARのトランザクション= context.Database.BeginTransaction())
    { 
        試み
        { 
            context.Blogs.Add(新しいブログ{のUrl = " http://blogs.msdn.com/dotnet " })。
            context.SaveChanges(); 
            context.Blogs.Add(新しいブログのURL {= " http://blogs.msdn.com/visualstudio " })。
            context.SaveChanges(); 
            VARのブログ= context.Blogs
                .OrderBy(B => b.Url)
                .ToList(); 
            // すべてのコマンドが成功した場合、トランザクションをコミットし、トランザクションの意志の自動ロールバック
             // どちらかのコマンドが失敗した場合に配置されたとき
            transaction.Commitを(); 
        } 
        キャッチ(例外)
        { 
            // TODO:ハンドル故障
        } 
    } 
}

6.まとめ

忙しい理由として、ここではEFシリーズは一時的に記録に行くために多くの時間を持っていない、最後に来ます。今日は、この章ではまた、怠惰な、もう少し簡潔に、具体的な公式の説明を盗んだ、私は以下の貼り付けられます、ご容赦ください。

参考文献:
基本的な保存
の関連データを保存するには、
DELETE CASCADE
トランザクションを使用して

おすすめ

転載: www.cnblogs.com/wzk153/p/12449538.html