Код EF4, сначала добавление элементов, не очень понятно для меня - PullRequest
5 голосов
/ 05 июля 2011

Я не понимаю, почему код сначала не добавляет новый элемент в коллекцию до тех пор, пока не вызовет savechanges. Я установил EF4.1 из NuGet (4.1.10331.0). Я создал следующий пример:

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 дает мои ноль предметов? - Почему список ctx.Items не содержит только что добавленный элемент, прежде чем я вызвал SaveChanges?

1 Ответ

4 голосов
/ 05 июля 2011

Почему первый звонок ctx.Items.Local дать мои ноль предметов?

Поскольку EF не загружал какие-либо элементы из базы данных (или вы их не добавляли). Следовательно, он еще не отслеживает какие-либо элементы. Это показано как 0.

Вот описание MSDN для Local

Возвращает ObservableCollection, которая представляет сущности множества, в настоящее время отслеживаются контекст и не были помечены как Удаленные. Доступ к свойству Local никогда не вызывает отправку запроса база данных. Это свойство обычно используется после того, как запрос уже был казнены.


Почему список ctx.Items не содержат только что добавленный элемент, прежде чем я называется SaveChanges?

Когда вы ссылаетесь ctx.Items, оно будет выбрано из базы данных. Поскольку в базе данных имеется только 1 элемент (вы еще не вызывали метод SaveChanges()), он отображает элементы в базе данных.

...