Я пытаюсь реализовать шаблон типа 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