我正在尝试实现一个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
}
Run Code Online (Sandbox Code Playgroud)
此测试失败,其中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
Run Code Online (Sandbox Code Playgroud)
这样做
dataContext.People.AsQueryable<Person>().Where(p => p.Name == "Bob").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
实际上会导致数据库调用,因此它不应返回任何未加载的数据.如果你想让你的人回来,你必须使用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();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2792 次 |
最近记录: |