EF4代码首先添加的项目对我来说不是很清楚

时间:2011-07-05 06:49:35

标签: 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("=========================================");
    }

首先,我向数据库添加了一条记录。然后我运行了这些结果:

    =========================================
    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列表中不包含刚刚添加的项目?

1 个答案:

答案 0 :(得分:4)

  

为什么第一次打电话给   ctx.Items.Local给我的零项?

因为EF没有从数据库加载任何项目(或者您没有添加任何项目)。因此它还没有跟踪任何项目。这显示为0

以下是Local

的msdn说明
  

返回ObservableCollection   表示集合的实体   目前正在跟踪   上下文并没有被标记为   删除。访问Local属性   永远不会导致查询被发送到   数据库。这个属性通常是   在查询已经使用之后使用   执行。


  

为什么ctx.Items列表没有   在我之前包含刚刚添加的项目   叫SaveChanges?

当您引用ctx.Items时,它将从数据库中获取。由于数据库中只有一个项目(您没有调用SaveChanges()方法),因此它显示了数据库中的项目。