我不明白为什么在调用savechanges之前,代码首先不向集合中添加新项。我从NuGet(4.1.10331.0)安装了EF4.1。我创建了以下示例:
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("=========================================");
}
首先,我向数据库添加了一条记录。然后我运行了这些结果:
=========================================
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列表中不包含刚刚添加的项目?
答案 0 :(得分:4)
为什么第一次打电话给 ctx.Items.Local给我的零项?
因为EF没有从数据库加载任何项目(或者您没有添加任何项目)。因此它还没有跟踪任何项目。这显示为0
。
以下是Local
返回ObservableCollection 表示集合的实体 目前正在跟踪 上下文并没有被标记为 删除。访问Local属性 永远不会导致查询被发送到 数据库。这个属性通常是 在查询已经使用之后使用 执行。
为什么ctx.Items列表没有 在我之前包含刚刚添加的项目 叫SaveChanges?
当您引用ctx.Items
时,它将从数据库中获取。由于数据库中只有一个项目(您没有调用SaveChanges()
方法),因此它显示了数据库中的项目。