Entity-framework-persistence
Entity Framework-永続性
Entity Frameworkにより、アプリケーションのすべての部分にEntity Frameworkを意識させることなく、Entity Frameworkを活用して、エンティティをインフラストラクチャから分離できるようになりました。 永続化の方法(データの保存場所とオブジェクト間のデータのやり取り)に関係なく、ビジネスルールに焦点を当てることができるクラスを作成できます。
永続的無知エンティティの作成
前の段落では、消費するデータのソースに関する詳細な知識がない方法について説明しました。 これは、永続性の無知の本質を浮き彫りにします。これは、クラスとその周りのアプリケーションレイヤーの多くがデータの保存方法を気にしない場合です。
- .NET 3.5バージョンのEntity Frameworkでは、既存のクラスを使用する場合、それらを強制的にEntityObjectから派生させて変更する必要がありました。
- .NET 4では、これはもう必要ありません。 Entity Frameworkの操作に参加するためにエンティティを変更する必要はありません。
- これにより、懸念の疎結合と分離を取り入れたアプリケーションを構築できます。
- これらのコーディングパターンを使用すると、クラスは独自のジョブにのみ関係し、UIを含むアプリケーションの多くのレイヤーは、Entity Framework APIなどの外部ロジックに依存しませんが、それらの外部APIは、エンティティ。
Entity Frameworkでエンティティを永続化する場合、2つの方法(接続と切断)があります。 どちらの方法にも独自の重要性があります。 接続されたシナリオの場合、変更はコンテキストによって追跡されますが、切断されたシナリオの場合、エンティティの状態についてコンテキストに通知する必要があります。
接続されたシナリオ
接続シナリオは、エンティティがデータベースから取得され、同じコンテキストで変更される場合です。 接続されたシナリオでは、Windowsサービスがあり、そのエンティティでいくつかのビジネスオペレーションを行っていると仮定します。そのため、コンテキストを開き、すべてのエンティティをループし、ビジネスオペレーションを行い、同じコンテキストで変更を保存します。最初に開いた。
学生がデータベースから取得され、学生の名を更新してからデータベースへの変更を保存する次の例を見てみましょう。
class Program {
static void Main(string[] args) {
using (var context = new MyContext()) {
var studentList = context.Students.ToList();
foreach (var stdnt in studentList) {
stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
}
context.SaveChanges();
////Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
上記のコードをコンパイルして実行すると、次の出力が表示され、次の出力に示すように、名前の前に編集済みの単語が添付されていることがわかります。
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Mark Upston
切断されたシナリオ
切断シナリオは、エンティティがデータベースから取得され、異なるコンテキストで変更される場合です。 プレゼンテーション層にいくつかのデータを表示し、n層アプリケーションを使用しているとします。そのため、コンテキストを開いてデータを取得し、最後にコンテキストを閉じた方が良いでしょう。 ここでデータを取得してコンテキストを閉じたため、取得したエンティティは追跡されなくなり、これは切断されたシナリオです。
Addメソッドを使用して、新しい切断されたStudentエンティティがコンテキストに追加される次のコードを見てみましょう。
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
};
using (var context = new MyContext()) {
context.Students.Add(student);
context.SaveChanges();
////Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
上記のコードをコンパイルして実行すると、次の出力が表示されます。
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram