EF4代码首先添加的项目对我来说不是很清楚
本文关键字:对我来说 清楚 项目 代码 添加 EF4 | 更新日期: 2023-09-27 18:01:01
我不明白为什么代码第一次调用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。物品。本地人给我零物品?-为什么ctx的列表。项目不包含在我调用SaveChanges之前刚刚添加的项目?
为什么第一个呼叫ctx。物品。本地人给我零物品?
因为EF没有从数据库中加载任何项目(或者您没有添加任何项目(。因此,它还没有跟踪任何项目。这显示为0
。
以下是Local
的msdn描述
返回ObservableCollection表示集合中的实体正在由跟踪上下文,尚未标记为已删除。访问本地属性从不将查询发送到数据库此属性通常已在查询之后使用已执行。
为什么ctx的列表。项目不是在我之前包含刚刚添加的项目称为SaveChanges?
当您引用ctx.Items
时,它将从数据库中提取。由于数据库中只有一个项(您尚未调用SaveChanges()
方法(,因此它显示了数据库中的项。