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のリストに含まれないのはなぜですか?
最後の質問について:SaveChangesの前のコレクションについて、項目が追加されていません(「追加後」セクション)。 –
@John編集の回答 – Eranga
しかし、なぜコレクションが現在のセッション/トランザクションを表していないのですか?今は現在のデータベースを表しており、それについては気にしません。 –