Asp объект objectcontext


ASP » Objects » ObjectContext

The ObjectContext object is used to control Active Server Pages transactions which are managed by the Microsoft Transaction Server (MTS). You may either complete (commit) or abort a transaction.

The @Transaction directive must be on the first line of the .asp file in order to use this object (see code examples). The @Transaction directive causes a transaction to run to completetion unless an abort occurs.

Methods

The SetAbort method declares that a transaction has not been completed and resources should not be updated.

The SetComplete method declares that the transaction has been completed and resources can be updated.

Events

The OnTransactionAbort event occurs when a transaction has been aborted for some kind of processing error. The signal of this event will run a handler script in the same file, if it exist.

The OnTransactionCommit event occurs when a transaction has been successfully completed. The signal of this event will run a handler script in the same file, if it exist.

Asp объект objectcontext

Use the COM+ ObjectContext object to access the ASP built-in objects from an application. This object implements the COM+ IObjectContext interface. The COM+ ObjectContext object provides a better and easier interface to access the ASP intrinsics. The COM+ object context also provides support for transaction processing.

In older versions of IIS, components accessed the ASP built-in objects by creating an instance of the ScriptingContext object, which implemented the IScriptingContext C++ Interface. Components that needed to access the ASP built-in objects did so through Page-level Event Methods. This approach still works in order to be compatible with existing ASP applications, however, using the COM+ ObjectContext object is easier and better as mentioned above, with one exception: if you implement your component as an executable file instead of a dynamic link library, you cannot use the COM+ ObjectContext object to access the ASP built-in objects. You must use IScriptingContext C++ Interface and Page-level Event Methods.

EF4 — возможно ли, какой объект ObjectContext отслеживает конкретную сущность?

EDIT: Я бы хотел получить окончательный ответ о том, можно ли определить, какой объект ObjectContext отслеживает, какие объекты. Есть ли определенное свойство, которое говорит: «Entity x принадлежит этому контексту?»

asp.net-mvc-2 entity-framework-4 entities automapper objectcontext

2 ответа

2 Решение cynic [2012-05-02 15:06:00]

Если у вас есть ссылки на все возможные экземпляры ObjectContext , вы можете определить, к какому экземпляру относится данный экземпляр объекта, вызывая их . ObjectStateManager.TryGetObjectStateEntry(Object, out ObjectStateEntry) — правильный возвращает true. Если вы этого не сделаете, нет простого публичного API для получения от экземпляра объекта экземпляра ObjectContext. Если объект имеет отношения и реализует IEntityWithRelationships, вы можете получить его RelationshipManager, попросите его получить какой-либо связанный конец (например, «свойство навигации» ) с GetAllRelatedEnds, попросите связанный с ним конец создайте запрос с CreateSourceQuery, переведите его в ObjectQuery и, наконец, получить .Context. Вам не нужно делать все это, если вы хотите использовать отражение для доступа к внутренним членам классов Entity Framework, но все же лучшее, что вы можете получить из экземпляра объекта без отношений, это ObjectStateManager , а не ObjectContext . Еще лучше, если вам требуется получить доступ к ObjectContext из экземпляра сущности, вы можете использовать нестандартный базовый класс сущности (с шаблоном генерации пользовательского кода или иным образом) с свойством ObjectContext , которое вы можете заполнить и очистить в обработчике событий для ObjectStateManagerChanged.

Это не обязательно отвечает на ваш вопрос, но важно, чтобы разработчик понимал контексты, для которых они создаются, и один из способов — реализовать «UnitOfWork». Для каждой единицы работы существует единый контекст и для этой единицы работы для выполнения конкретной задачи (например, сохранение данных формы). Используя шаблон «UnitOfWork», он затем получает ИД для зависимых объектов (или самого объекта для Идентификатора), извлекает объекты, создает новые объекты, подключает зависимые и новые объекты, а затем сохраняет изменения. Затем для блока кода, вызывающего единицу работы, уведомлять другие области кода, для которых были внесены изменения посредством обмена сообщениями. Но поскольку вы являетесь апатридом, соглашение о передаче сообщений не будет применяться напрямую.

Во-вторых, я почти не использую AutoMapper или аналогичный и вместо этого использую POCO с кодом First. Используя это соглашение, я теперь использую объекты POCO как бизнес-объекты, которые заполняются слоем данных (EF), где мои конфигурации теперь встречаются в методе OnModelCreating DbContext (UnitOfWork). Удаление всего процесса сопоставления уменьшает количество кода и сложность. Поэтому моя рекомендация — взглянуть на ваш дизайн и убедиться, что есть четкие шаблоны, для которых вы управляете/разделяете доступ к данным.

При всем том, что mappers отлично подходят для веб-сервисов. Цель состоит в том, чтобы минимизировать количество данных, отправленных и полученных через обработку запроса и ответа. Например, если все, кто хочет позвонить, это имя и фамилия, поэтому нет смысла отправлять весь профиль.

объем объекта objectContext

Сегодня я столкнулся с проблемой, которую не могу точно объяснить причину, поэтому я думаю, что лучше поделиться им через stackoverflow.

Ну, у меня есть приложение mvc 3 с сущностями .net, и я попытался вставить в БД огромную строку, и это привело к появлению sqlExeepton «строка или двоичные данные будут обрезаны». Хорошо до здесь, я исправлю это позже :).

После этой проблемы я попытался обновить ту же сущность на одно значение (фактически я увеличил счетчик) и снова получил то же исключение. Это было немного.

Если я располагаю objectContext в конце каждого метода или создаю новый objectContext в начале каждого метода, проблема будет решена.

То, что я не могу понять, как реагирует objectContext, если он инициализируется в классе вместо метода

1 ответ

как objectContext реагирует, если он инициализируется в классе?


У вас будет один экземпляр, который живет до тех пор, пока живет ваш класс контроллера. И это будет соответствовать времени жизни одного http-запроса, и это будет рекомендуемое время жизни при кодировании веб-приложений.

Таким образом, вы получаете свежий контекст для каждого отдельного запроса и вам не нужно беспокоиться о каком-то старом состоянии, хранящемся в старом объекте контекста.

Управление объектной структурой ObjectContext в ASP.NET — .net

Я использую Entity Framework для приложения ASP.NET Web Forms, и мне интересно, как я должен работать с ObjectContext и это время жизни. Например, у меня есть класс InviteService , который управляет приглашениями, такими как создание и принятие приглашений. Сам класс находится в другом проекте/пространстве имен из веб-проекта. Метод InviteUsers() создает объекты Invite для списка пользователей, вызывает репозиторий, чтобы сохранить их в базе данных, и отправляет каждому пользователю ссылку на приглашение.

Метод вызывается из Page , когда пользователь нажимает кнопку приглашения.

Я хотел бы знать, как я должен использовать ObjectContext

  • Создайте новый ObjectContext на странице в каждом запросе, передав его как параметр конструктору класса InviteService , а затем удалив его в методе Render .
  • То же, что и выше, но вместо того, чтобы устанавливать его через конструктор, передавая его как параметр для каждого метода.
  • Создайте отдельный ObjectContext в каждом методе с блоком using .

Вариант один кажется мне лучше, основываясь на ответе Ладислава здесь: Entity Framework и Connection Pooling Но вариант 3 кажется правильным, так как, насколько я знаю, никаких новых подключений к базе данных не происходит из-за пула соединений.

    2 2
  • 31 окт 2020 2020-10-31 11:09:00
  • Freek

2 ответа

1 — лучшее решение. В мире NHibernate называется сеансом за запрос.

Вы можете создать объект ObjectContext в BeginRequest и выполнить флеш/зафиксировать его в EndRequest.

1 лучше, чем 3, потому что вы начинаете работать с ORM (Entity Framework в вашем случае), когда поступит запрос. Затем вы добавляете объект в дерево, модифицируете класс, удаляете и т.д. Во время жизненного цикла ALL.

Только во время EndRequest вы производите ВСЕ свои изменения только в одной партии.

EDIT: как говорит @Steven, он не идеален для устранения исключения во время фиксации.

Итак, предположим, что у вас есть веб-форма с кнопкой сохранения:

  • создать ObjectContext во время BeginRequest
  • вызов commit в команде «Сохранить команду»
  • просто закрыть/удалить ObjectContext во время EndRequest
  • 31 окт 2020 2020-10-31 11:09:02
  • Be.St.

Нет ничего необычного в создании одного ObjectContext для каждого веб-запроса. Я делаю это в своих веб-приложениях. Однако, IMO, страница не должна знать ничего о ObjectContext .

Поскольку вы уже говорите о введении контекста в конструкторе службы, посмотрите на инъекцию зависимостей (если вы еще не используете это). Когда вы используете контейнер инъекции зависимостей, вы можете позволить контейнеру создать эту службу для вас и ввести контекст объекта в этом контейнере. Единственное, что должна сделать ваша страница — это запросить сервис из контейнера (в идеале, вы даже позволили бы этой услуге встраиваться в конструктор этой страницы, но это невозможно в веб-формах).

Ваша страница будет выглядеть так:


В стартовом пути (Global.asax) вашего приложения вы можете настроить инфраструктуру Injection Dependency следующим образом:

В этих примерах я использовал контейнер инъекции Simple Injector, хотя любой контейнер DI будет делать. RegisterPerWebRequest не является частью основной библиотеки, но доступен как пакет расширения (NuGet). Пакет гарантирует, что ваш ObjectContext будет удален, когда веб-запрос будет завершен.

Сначала это может показаться сложным, но на этом веб-странице вообще не нужно беспокоиться о каких-либо деталях создания и удаления ObjectContext .

Кроме того, поместите логику, которая выполняет прецедент в одном классе: команда. Пусть команда (или система) обеспечивает атомарность этой операции. Не позволяйте странице нести ответственность за это и не выполняйте ее в конце запроса, потому что в этот момент вы не будете знать, нормально ли даже совершать вызов. Нет, пусть команда справится с этим сама. Вот статья о написании бизнес-команд.

Управление Entity Framework ObjectContext в ASP.NET

Я использую Entity Framework для приложения веб-форм ASP.NET, и мне интересно, как я должен иметь дело с ObjectContext и это жизнь. Например, у меня есть InviteService класс, который управляет приглашениями, такими как создание и принятие приглашений. Сам класс находится в другом проекте/пространстве имен из веб-проекта. InviteUsers() метод создает Invite объекты для списка пользователей, вызывает хранилище для сохранения их в базе данных и отправляет каждому пользователю ссылку для приглашения.

Метод вызывается из Page когда пользователь нажимает кнопку приглашения.

Я хотел бы знать, как я должен использовать ObjectContext

  1. Создать новый ObjectContext на странице каждого запроса, передавая его в качестве параметра конструктору InviteService класс, а затем избавиться от него в Render метод.
  2. То же, что и выше, но вместо того, чтобы устанавливать его через конструктор, передавая его в качестве параметра каждому методу.
  3. Создать отдельный Objectcontext в каждом методе с using блок.

Первый вариант кажется мне лучшим, основываясь на ответе Ладислава здесь: Entity Framework и пул соединенийНо вариант 3 также кажется действительным, поскольку, насколько я знаю, новые подключения к базе данных не создаются из-за пула подключений.

2 ответа

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

Это не необычно, чтобы создать один ObjectContext за веб-запрос. Я делаю это в своих веб-приложениях. Тем не менее, ИМО, страница должна ничего не знать о ObjectContext .

Поскольку вы уже говорите о внедрении контекста в конструктор службы, взгляните на внедрение зависимостей (если вы его еще не используете). Когда вы используете контейнер внедрения зависимостей, вы можете позволить контейнеру создать этот сервис для вас и внедрить контекст объекта в этот контейнер. Единственное, что ваша страница должна сделать, это запросить этот сервис из контейнера (в идеале, вы бы даже позволили этому сервису внедриться в конструктор этой страницы, но это невозможно с веб-формами).

Ваша страница будет выглядеть так:

В пути запуска (Global.asax) вашего приложения вы можете настроить инфраструктуру внедрения зависимостей следующим образом:

В этих примерах я использовал Простой инжектор контейнер внедрения зависимости, хотя любой контейнер DI сделает. RegisterPerWebRequest не является частью базовой библиотеки, но доступно как (NuGet) расширение пакета. Пакет гарантирует, что ваш ObjectContext удаляется после завершения веб-запроса.

Поначалу это может показаться сложным, но при этом веб-странице не нужно беспокоиться о деталях создания и утилизации ObjectContext .

Кроме того, поместите логику, которая выполняет сценарий использования, в один класс: команду. Пусть команда (или система) обеспечивает атомарность этой операции. Не позволяйте странице отвечать за это и не фиксируйте в конце запроса, потому что в этот момент вы не будете знать, нормально ли будет вызывать commit. Нет, пусть команда справится с этим сама. Вот статья о написании бизнес-команд.

Этот совет относится и к ASP.NET MVC, хотя вы не должны вызывать Global.GetInstance () внутри конструктора контроллера, но просто используйте инъекцию конструктора (поскольку MVC имеет большую поддержку для этого) и используйте Интеграционный пакет MVC3.

Также взгляните на этот вопрос Stackoverflow, который говорит о выборе между IObjectContextFactory или имея ObjectContext по запросу.

1 лучшее решение. В мире NHibernate называется session-per-request.

Вы можете создать экземпляр ObjectContext в BeginRequest и сбросить/зафиксировать его в EndRequest.

1 лучше, чем 3, потому что вы начинаете работать с ORM (Entity Framework в вашем случае), когда приходит запрос. Затем вы добавляете объект в дерево, изменяете класс, удаляете и так далее в течение всего жизненного цикла ВСЕЙ страницы.

Только во время EndRequest вы делаете ВСЕ свои изменения только в одном пакете.

РЕДАКТИРОВАТЬ: как говорит @Steven, не идеально подходит для работы с исключениями во время фиксации.

Предположим, у вас есть веб-форма с кнопкой сохранения:

  • создать ObjectContext во время BeginRequest
  • вызов коммита в обработчике команд Save
  • просто закройте/утилизируйте ObjectContext во время EndRequest


О программировании и всём, всём, всём

четверг, 5 июня 2014 г.

О ObjectContext и DbContext в одном проекте

Столкнулся с забавной ситуацией. Если в рамках одного проекта используются две Entity модели, причем одна из них потомок ObjectContext, а вторая DbContext, то при попытке загрузить сущности в потомок DbContext падает ошибка «Не найден тип концептуальной модели для . » где вместо точек стоит сущность из другого контекста. По английски, эта ошибка звучит так «Could not find the conceptual model type for». Под катом, как с этим бороться.

Вариантов два:
1. Заменить ObjectContext на DbContext, правда нам этот вариант не подошел, т.к. сохранения в DbContext при паре миллионов сущностей работают очень медленно.
2. А вот другой вариант оказался весьма неожиданным. На русском языке есть забавное предложение вот здесь. Но у меня это не заработало, стали падать выборки из контекста потомка ObjectContext. А вот на английском есть весьма интересная информация здесь. Т.е. чтобы в рамках одного проекта можно было использовать две таких модели, они должны быть вынесены в разные сборки. Вот так:

Christophe Geers’ Blog

Christophe Geers’ Blog about .NET programming

Entity Framework ObjectContext

February 21, 2009

Introduction

It’s been a good two months since the last post. Today I finally found some spare time to write a new article about .NET. This will be the first article on this blog focusing solely on the Entity Framework. More in particular about using the Entity Framework in different environments such as Windows Applications and in an ASP.NET environment.

The Entity Framework has some drawbacks that will hopefully be addressed in the second release, but in its current state it’s already a really useful technology to use for database access.

This article will not discuss every feature of the Entity Framework as that would entail writing an entire book. The primary focus is on how to deal with the ObjectContext in different environments such as a regular Windows Application and a Web Application (ASP.NET). Let’s get started…

Table Of Contents

ObjectContext

As you may be aware every object returned by a query (Linq To Entities, Entities SQL…) is automatically attached to an object context. This context tracks the changes applied to these objects so that it can later figure out how to persist these changes to the underlying data store.

This object context is represented by a class fittingly named ObjectContext. The ObjectContext encapsulates a couple of things, namely:

  • The connection to the underlying data store (database)
  • Metadata describing the Entity Data Model (EDM)
  • An ObjectStateManager for tracking changes to the objects

As you will see in the next sections how you deal with the ObjectContext depends on the target platform of your application.

Demo Solution

Let’s quickly setup up a demo project that we can use throughout the rest of this text. First let us create a simple database using SQL Server consisting out of two tables [Customer] and [Order].

The following two figures list the columns for each of these tables. You can find the DDL statements to build this database in the source code accompagnying this article.

I’ve called my database “Westwind” but feel free to choose a more appropriate name.

Figure 1 – Customer table

Figure 2 – Order table

The [Order] table contains a foreign key connecting it’s CustomerId column to the Id column of the [Customer] table. Thanks to this relation we can easily navigate back and forth between the Customer and Order entities in the resulting Entity Data Model (EDM).

Now fire up Visual Studio 2008 and create a new blank solution named “ObjectContext” and add a class library to it (C#) titled “DAL” (short for Data Access Layer). Delete the automatically generated class Class1 and add a new ADO.NET Entity Data Model called “Westwind.edmx”.

Using the resulting wizard choose the option “Generate from database” to let Visual Studio generate an Entity Data Model based upon the previously created database. After the model is generated the necessary references to the required assemblies are automatically added to the project.


Figure 3 – ObjectContext Solution

The Entity Data Model contains two entities, namely Customer and Order. I’ve renamed the Entity Set Name properties of the Customer and Order entities respectively to Customers and Orders. As a last step the navigation property Order on the Customer entity has been renamed to Orders as a customer can have one or more orders.

Figure 4 – Westwind Entities

Voila, that concludes setting up the demo project. Let’s move on to the next section…

Remarks

  • Be sure you have the first service pack installed for both the .NET Framework 3.5 and Visual Studio 2008 as both are required in order to be able to work with the Entity Framework.
  • The example is kept as simple as possible in order to focus solely on the subject of this article. It’s not a guideline on how to organize your projects into different layers and such.

Windows Application

I’ve added some dummy data to the table using SQL Server Management Studio Express. There are three customer and each has exactly one order.

Figure 5 – Customer Data

Figure 6 – Order Data

Regular Windows Applications (Console, WinForms, WPF…) are the easiest to work with in regard to handling the ObjectContext. Let’s demonstrate this using a Console application.

Add a new Console application and add a reference to the DAL project and the System.Data.Entity assembly. Next add an application configuration file (App.config) and copy the connection string found in the App.config file of the DAL project. Finally add the code of Listing 1 to the main method.

Listing 1 – ObjectContext in a Console application

A new connection (context) is made to the database and the orders are queried and displayed. Next the first order found is updated and finally the orders are displayed once more.

All this happens using the same ObjectContext (see the using statement). It tracks the changes made to the order objects and generates the necessary SQL to persist these changes in the database upon the call to context.SaveChanges().

Figure 7 – The Output

If you’re interested in finding out what the generated SQL looks like I recommend using the AnfiniL’s SQL Express Profiler tool. It’s free and easy to use.

Shared ObjectContext

You can as the previous example has shown create an ObjectContext when needed and dispose of it immediately after. However you can also choose to share the same ObjectContext accross multiple methods, instances…etc. if you want to limit the amount of ObjectContext instances in your application.

One way of doing this is to encapsulate the ObjectContext in a class that adheres to the singleton pattern. Take a look at the code in Listing 2.

Listing 2 – Shared ObjectContext

The following Listing shows how you would use this shared ObjectContext.

Listing 3 – Usage Of The Shared ObjectContext

You can find this code in the ConsoleSharedObjectContext project included in the demo source code.

Remark: Limit the scope of the ObjectContext. It is recommended to use the ObjectContext instance within a using statement. This ensures that the resources associated with the ObjectContext are automatically disposed when the using statement exists. Make sure your application benefits from a shared ObjectContext, for instance if you bind control to objects maintained by the ObjectContext.

ObjectContext in ASP.NET

To quote MSDN: “The ObjectContext class is not thread safe. The integrity of data objects in an ObjectContext cannot be ensured in multi-threaded scenarios.”.

This rules out using the afore mentioned approach in an ASP.NET environment as it is inheritly multi-threaded. Each request is handled by a separate thread. To circumvent the problem the solution is to use an ObjectContext per Http request. The following Listing shows one possible approach.

Listing 4 – ObjectContext Per Http Request


To demonstrate its usage add a new Web Application project to the solution, add the necessary references to the DAL project and the System.Data.Entity assembly. Finally add the connection string to the Web.config file.

Open up the default.aspx page in design view and add a GridView. Add the following code to the code-behind in the Page_Load(…) event handler to bind some data to the grid.

Listing 5 – Default.aspx.cs code-behind

The output is a list of the customers.

Figure 8 – The Output In ASP.NET

Summary

While there is much debate going on about the Entity Framework I certainly feel that this first release offers a valid alternative to any prior existing data access technologies.

Working with the Entity Framework entails dealing with the ObjectContext. As demonstrated the way the ObjectContext is too be handled depends on the target platform. Sharing the ObjectContext on one thread poses no problem (Windows Applications), however as soon as you end up in a multi-threaded environment (ASP.NET) you must implement some custom logic to ensure the integrity of the data objects within the ObjectContext.

Download

You can find the source code for this article on the Download page of this blog.

C# Entity Framework, использующая только один объект ObjectContext для HttpContext

В ASP.NET MVC 2, используя Entity Framework 4, я получаю эту ошибку «Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker».

Поиск SO показывает, что это, вероятно, потому, что у меня есть разные экземпляры Object Entity Framework ObjectContext, когда он должен быть только одним экземпляром ObjectContext для каждого HttpContext.

У меня есть этот код (написанный задолго до того, как я присоединился), который, кажется, делает именно это — имеет один ObjectContext для каждого HttpContext. Но я получаю «IEntityChangeTracker» исключение часто так это, вероятно, не работает по назначению:

Я изучил этот код и он выглядит правильно. Он, насколько я могу сказать, возвращает один экземпляр ObjectContext для каждого HttpContext. Код неправильный?

Если код не является ошибочным, зачем еще я получаю сообщение об ошибке «Объект сущности не может ссылаться на несколько экземпляров исключения IEntityChangeTracker»?

EDIT: Для того, чтобы показать, как ObjectContext расположен:

Создан 14 июл. 11 2011-07-14 05:19:32 JK.

Meera Academy

ASP.Net C# Examples

Context Object in ASP.Net

Context object in ASP.Net

In previous asp.net post we learnt state management Session and ViewState. In this post we will learn about Context object.

The asp.net Context object is same as asp.net session object. But the Context will be null when page posted to server while Session can store values on post back.

We must use Server.Transfer method for redirection when we use Context in asp.net. If we use Response.Redirect method for redirect to other page the page complete the round trip of post back so Context will be null.

The main difference between Context object and Session:

  • With Context object we must use Server.Transfer method for redirect to other page.
  • If we use Response.Redirect method with Context then the Context value will be null on other page.
  • With Session we use both method for redirect.

Syntax of Context

Declare and assign value to Context object.

Retrieve Context value on NextPage.aspx

string myvalue = Context.Items[“Id”].ToString();
Response.Write(“Your Value = “+ myvalue);

Context Object Example in ASP.Net

Open visual studio and design web form with textbox control along with a button control. Here, we will send textbox value to other page nextpage.aspx using context object and we use Server.Transfer method for redirect to other page. In nextpage.aspx page on Page_Load events we will retrieve value from context and display it in label control.

Context Object in ASP.Net

C# code for above example

write below code on send button on first page.

Илон Маск рекомендует:  DateToStr - Функция Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Note: