我正在尝试实现一个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
答案 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();