2011-07-05 3 views
5

savechangesを呼び出すまで、コードが最初に新しい項目をコレクションに追加しない理由を理解できません。私はNuGet(4.1.10331.0)からEF4.1をインストールしました。次の例を作成しました:EF4コードが最初に私にあまり明確でない項目を追加しました

public class TinyItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class TinyContext : DbContext 
{ 
    public virtual DbSet<TinyItem> Items { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var ctx1 = new TinyContext()) 
     { 
      ListItems(ctx1, "Start"); 

      ctx1.Items.Add(new TinyItem { Name = "Test1" }); 
      ListItems(ctx1, "After add"); 

      ctx1.SaveChanges(); 
      ListItems(ctx1, "After commit"); 
     } 

     Console.ReadKey(); 
    } 

    public static void ListItems(TinyContext ctx, string label="") 
    { 
     Console.WriteLine("========================================="); 
     Console.WriteLine(label); 
     Console.WriteLine(string.Format("Items.Local: {0}", ctx.Items.Local.Count)); 
     foreach (var item in ctx.Items.Local) 
     { 
      Console.WriteLine(string.Format("{0} = {1}", item.Id, item.Name)); 
     } 
     Console.WriteLine(string.Format("Items: {0}", ctx.Items.Count())); 
     foreach (var item in ctx.Items) 
     { 
      Console.WriteLine(string.Format("{0} = {1}", item.Id, item.Name)); 
     } 
     Console.WriteLine("========================================="); 
    } 

最初に、データベースにレコードを1つ追加しました。それから私はこれを実行し、これらの結果は以下のとおりです。

========================================= 
    Start 
    Items.Local: 0 
    Items: 1 
    4 = Test1 
    ========================================= 
    ========================================= 
    After add 
    Items.Local: 2 
    4 = Test1 
    0 = Test1 
    Items: 1 
    4 = Test1 
    ========================================= 
    ========================================= 
    After commit 
    Items.Local: 2 
    4 = Test1 
    5 = Test1 
    Items: 2 
    4 = Test1 
    5 = Test1 
    ========================================= 

は、私の質問は以下のとおりです。 - なぜctx.Items.Localの最初の呼び出しは、私のゼロのアイテムを与えるのでしょうか? - SaveChangesを呼び出す前に、追加したアイテムがctx.Itemsのリストに含まれないのはなぜですか?

答えて

4

ctx.Items.Localの最初の呼び出しでゼロアイテムが返されるのはなぜですか?

EFはデータベースの項目をロードしていない(または追加していない)ためです。したがって、まだアイテムを追跡していません。これは0として示されています。

はここ が が現在 コンテキストによって追跡されていると 削除済みとしてマークされていないことセットの実体を表していることLocal

返しのObservableCollectionについては、MSDNの説明です。ローカルプロパティ にアクセスすると、 データベースにクエリが送信されることはありません。このプロパティは、クエリが既に で実行された後に使用される通常は です。


なぜctx.Itemsのリストではありません はI と呼ばれるのSaveChangesの前に追加した項目が含まれていますか?

ctx.Itemsを参照すると、データベースからフェッチされます。データベースには1つのアイテム(SaveChanges()メソッドは呼び出されていません)しかないので、データベースにアイテムが表示されます。

+0

最後の質問について:SaveChangesの前のコレクションについて、項目が追加されていません(「追加後」セクション)。 –

+0

@John編集の回答 – Eranga

+0

しかし、なぜコレクションが現在のセッション/トランザクションを表していないのですか?今は現在のデータベースを表しており、それについては気にしません。 –

関連する問題