EF DataContext选择未保存的对象

时间:2010-08-17 06:03:13

标签: entity-framework

我正在尝试实现一个UnitOfWork类型模式,其中一个DataContext用于一小组相关方法,并且仅在最后保存更改。但是,我发现添加到ObjectContext的实体似乎可以重新选择,除非我正在尝试避免使用SaveChanges。有人能告诉我这是否是预期的行为?我提供了一个psuedo测试来说明:

    [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

    }

此测试失败,其中actualPerson为null且People的Count设置未递增。如果有任何拼写错误,请原谅我,因为我刚刚简化了自己的ObjectContext。

仅供参考我使用的是EF 4。

TIA。

- 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 个答案:

答案 0 :(得分:5)

这样做

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();