Убедитесь, что объект уже находится в контексте Entity Framework - PullRequest
6 голосов
/ 10 декабря 2010

У меня возникает проблема при использовании EF4, когда я пытаюсь проверить, находится ли объект уже в контексте Entity Framework.

У меня есть этот код ниже

        var entityName = Entity4Test + Guid.NewGuid();

        using( var ctx = new EnviroDataContext() )
        {
            var etc = new Entity
            {
                Name = entityName
            };

            ctx.Entity.AddObject( etc );

                var q = from p in ctx.Entity
                        where p.Name == entityName
                        select p;

// Why 'q.ToList().Count == 0'?

                ctx.SaveChanges();
            }

Мой вопрос: почему мой поиск после вставки оказался пустым?

Я знаю, что данные сохраняются после «SaveChanges», но что, если мне нужно «запросить» данные моей памяти сущностей.

Расширение вопроса

У меня есть бизнес-правило, которое, добавляя 1 элемент A, запускает вставку других объектов B. Проблема в том, что у меня есть правило проверки, что при вставке B, t уже должно существовать.

Поскольку все эти действия выполняются до 'SaveChanges', я получаю сообщение об ошибке, что EntityA не существует.

Другой случай , у меня есть уникальное поле Имя в таблице. Если я пытаюсь запустить AddEntityName («bla») дважды, а затем «SaveChanges», я получаю исключение из БД [Уникальные ограничения], даже после прохождения проверки для вставки, которая гарантирует, что имя уникально.

У кого-нибудь есть идеи?

Ответы [ 2 ]

9 голосов
/ 10 декабря 2010

Когда вы делаете .AddObject, он добавляет его к внутреннему «графику» EF (памяти) в состоянии ожидания «Добавлен».

Только после того, как вы сделаете ctx.SaveChanges(), изменения будут сохранены вбазовое хранилище.

Вы пишете запрос к базе данных, и изменение еще не сохранено.

Так что если вы выполните свой запрос после , высделайте ctx.SaveChanges(), количество будет таким, как ожидалось.

Если вы хотите увидеть, есть ли уже сущность на графике (например, перед тем, как вы «Прикрепите»), прочитайте ObjectStateManager.TryGetObjectStateEntry .

1 голос
/ 10 декабря 2010

Я не использовал EF4, но использовал предыдущую версию, поэтому я не знаю, отличаются ли они от EF4.Похоже, вы пытаетесь найти актив в БД перед его фактической фиксацией.Сначала вы должны вызвать SaveChanges, а затем найти его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...