#asp.net #entity-framework
#asp.net #entity-framework
Вопрос:
Кто-нибудь может сказать мне, возможно ли использовать NoTracking (MergeOption.Нотрекинг) с элементом управления EntityDatSource?
Если да, то каким образом?
Ответ №1:
Реализовать обработку для ContextCreating
события и установить MergeOption
для ObjectSet<T>
:
public partial class YourPage : System.Web.UI.Page
{
...
protected void EntityDataSource_ContextCreating(object sender,
EntityDataSourceContextCreatingEventArgs e)
{
e.Context = new YourContext(); // EntityDataSource handles disposing
e.Context.YourObjectSet.MergeOption = MergeOption.NoTracking;
}
}
И в разметке использовать:
<asp:EntityDataSource ... OnContextCreating="EntityDataSource_ContextCreating" />
Комментарии:
1. Как бы вы порекомендовали мне интегрировать это в «Один ObjectContext на HTTP-запрос»? Похоже, это рекомендуемая платформа / решение. Согласны?
2. Если у вас есть один контекст, вы все равно можете получить контекст в обработчике и, установить опцию слияния и использовать ее, не так ли? Более того, при вызове этого события любые методы, в которых вам требуется отслеживание изменений, должны быть уже завершены, поэтому это не должно вызывать никаких проблем. Если это так, вам следует подумать о проблеме с другой точки зрения: один контекст на запрос — минимально рекомендуемое решение. Вы можете иметь больше контекстов, если они вам нужны, но вы должны правильно их использовать, и вы не должны делиться ими между запросами
3. Правильно. Я просто имел в виду «в целом», как бы вы реализовали «единый контекст для каждого запроса». Но я нашел несколько примеров в строке. Спасибо!
4. Есть ли способ выполнить итерацию по ВСЕМ наборам объектов в объекте? Я хотел бы включить EntityDataSource_ContextCreating() в мою базовую страницу и заставить ее обрабатывать настройку NoTracking для любого ObjectSet, который может быть представлен в contex. Хотя я не уверен, как выполнить итерацию по ВСЕМ наборам объектов, и я определенно не хочу жестко кодировать все из них, такие как: (например,context как MyEntities). Объект 1. MergeOption = MergeOption. NoTracking; т.е.контекст в качестве MyEntities). Объект 2. MergeOption = MergeOption. Нотрекинг; и т.д…
5. Это может быть сделано только с помощью отражения, потому что эти наборы объектов отображаются в производном экземпляре контекста как свойства. Такое отражение будет намного медленнее.