EF DataContext, выбирающий несохраненные объекты - PullRequest
4 голосов
/ 17 августа 2010

Я пытаюсь реализовать шаблон типа UnitOfWork, в котором один DataContext используется в короткой группе связанных методов, и только в конце я сохраняю изменения. Однако я обнаружил, что сущности, добавленные в ObjectContext, по-видимому, доступны для повторного выбора, если только я не сохраню изменения, чего я и пытаюсь избежать Может кто-нибудь сказать мне, если это ожидаемое поведение? Я предоставил тест псевдо для иллюстрации:

    [Test]
    public void ObjectContext_ShouldSelectBackUncommitedValuesWhenUsingTheSameContext()
    {
        //arrange
        var entityConnectionString = "MyEntityConnectionString";
        var dataContext = new MyObjectContext(entityConnectionString);

        var personCount = dataContext.People.AsQueryable<Person>().Count();
        var person = new Person() { Name = "Bob" };

        //act
        dataContext.AddToPeople(person);

        //assert
        var actualPerson = dataContext.People.AsQueryable<Person>().Where(p => p.Name == "Bob").FirstOrDefault();
        Assert.IsTrue(actualPerson != null,"Uncommitted Person should return when using same context");

        var actualCount = dataContext.People.AsQueryable<Person>().Count();
        Assert.IsTrue(actualCount == personCount + 1, String.Format("Expected {0} people but got {1} people", personCount + 1, actualCount));

        //leave transaction to rollback

    }

Этот тест не пройден, при этом значение фактического лица равно нулю, а число людей установлено без увеличения. Простите, если есть какие-либо опечатки, так как я только упростил свой собственный ObjectContext.

К вашему сведению, я использую EF 4.

ТИА.

- EDIT-- Далее, по аналогии, я надеялся, что смогу работать с незафиксированными объектами, как я могу в SQL, например:

CREATE TABLE Person (Name nvarchar(10));
INSERT INTO Person VALUES ('Francois')
INSERT INTO Person VALUES ('Hans')

SELECT COUNT(*) FROM Person

BEGIN TRANSACTION
INSERT INTO Person VALUES ('Bob')
SELECT 'Bob Lives!' WHERE EXISTS(SELECT * FROM Person WHERE NAME='Bob')
ROLLBACK TRANSACTION

DROP TABLE Person

1 Ответ

5 голосов
/ 17 августа 2010

Делая это

dataContext.People.AsQueryable<Person>().Where(p => p.Name == "Bob").FirstOrDefault();

на самом деле приводит к вызову базы данных, поэтому он не должен возвращать никаких непроверенных данных. Если вы хотите вернуть своего человека, вы должны использовать ObjectStateManager:

dataContext.ObjectStateManager.
           GetObjectStateEntries(EntityState.Added | EntityState.Deleted | 
                                 EntityState.Modified | EntityState.Unchanged).
           Where(ent => ent.Entity is Person).
           Select(ent => ent.Entity as Person).
           Where(p => p.Name == "Bob").
           FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...