Entity Framework: хранение сущностей без сохранения в базе данных - PullRequest
6 голосов
/ 10 мая 2011

Как сохранить временный элемент в ObjectContext без сохранения в базе данных?

Сохранение контекста в HttpContext с предоставлением по классу:

public static class HttpContextExtension
{
    public static MyEntityDataModelContainer GetMyContext(this HttpContext httpContext)
    {
        if (httpContext.Items["MyEntityDataModelContainer"] == null)
        {
            httpContext.Items.Add("MyEntityDataModelContainer", new MyEntityDataModelContainer());
        }

        return (MyEntityDataModelContainer)httpContext.Items["MyEntityDataModelContainer"];
    }
}

Есть две пустые страницы: 1) FirstPage.aspx.cs: ​​

public class FirstPage : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // crete new item
        MyEntity newTemporaryItem = new MyEntity { MyEntityID = Guid.NewGuid() };
        // attach them to Context
        HttpContext.Current.GetMyContext().MyEntitySet.Attach(newTemporaryItem);
        // save changes
        HttpContext.Current.GetMyContext().SaveChanges();

        // get all attached to Context items
        var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged)
                          where se.Entity is MyEntity
                          select se.Entity).AsQueryable();
        int CountInFirstPage = addedItems.Count();
    }
}

Итак, CountInFirstPage = 1.

2) SecondPage.aspx.cs:

public class FirstPage : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // get added in First page items From HttpContext
        var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged)
                          where se.Entity is MyEntity
                          select se.Entity).AsQueryable();
        int CountInSecondPage = addedItems.Count();
    }
}

Здесь CountInSecondPage = 0.

Где я не прав?

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

Прав ли я, что вторая страница является вторым запросом?

В этом случае у вас есть новая коллекция HttpContext.Items, и ваши значения из последнего запроса исчезли.В таком случае рекомендуется использовать сеанс для хранения этих значений.

Сноска: EntityContext должен использоваться только для одного запроса и может быть сохранен в коллекции HttpContext.Items по этой причине, но никогда какЗначение сеанса!Хранить только результаты здесь, как количество.

2 голосов
/ 10 мая 2011

Это неправильный подход, HttpContext имеет область действия только одного HTTP-запроса, поэтому вы имеете дело с другим контекстом во втором запросе.

Но даже если бы можно было сохранитьТаким образом, контекст БД, т. Е. Даже если вы решили сохранить его в сеансе - это не тот путь, с которым контекст каждого контекста должен составлять одну единицу работы, вы не должны поддерживать его в течение длительного периода времени.особенно в веб-среде.

Просто сохраните временные элементы непосредственно в сеансе и создайте новый контекст для загрузки этих элементов, когда вы будете готовы.

0 голосов
/ 10 мая 2011

Чтобы выполнить запрос новых данных с помощью EF, вам необходимо сохранить.Вы можете создать список, а затем выполнить запрос к списку, но для этого потребуется, чтобы список оставался в некоторой статической памяти (состояние сеанса, состояние просмотра, кэш), но если список большой, это может создать другие проблемы.

Вы можете сделать все за СДЕЛКА .Передача транзакции, пока вы не подтвердите или не откатитесь.Объекты сущности сохраняются, но когда откат транзакции отменяется, любые изменения отменяются.Я думаю, что транзакция будет продолжаться с помощью обратных передач и перенаправлений, но ее необходимо будет зафиксировать или удалить к моменту отображения вашей страницы.

...