Joh*_*eer 5 c# entity-framework ef-code-first
我不明白为什么代码在调用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("=========================================");
}
Run Code Online (Sandbox Code Playgroud)
首先,我向数据库添加了一条记录.然后我运行了这些结果:
=========================================
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
=========================================
Run Code Online (Sandbox Code Playgroud)
我的问题是: - 为什么第一次调用ctx.Items.Local给我的零项? - 为什么在调用SaveChanges之前,ctx.Items列表中不包含刚添加的项目?
为什么第一次调用 ctx.Items.Local 会给出零个项目?
因为 EF 尚未从数据库加载任何项目(或者您尚未添加任何项目)。因此它还没有跟踪任何项目。即显示为0。
这是msdn的描述Local
返回 ObservableCollection,它表示当前正在由上下文跟踪且尚未标记为“已删除”的集合中的实体。访问 Local 属性绝不会导致将查询发送到数据库。该属性通常在查询执行后使用。
为什么在我调用 SaveChanges 之前 ctx.Items 列表不包含刚刚添加的项目?
当您引用时ctx.Items,它将从数据库中获取。由于数据库中只有 1 个项目(您尚未调用该SaveChanges()方法),因此它显示数据库中的项目。