Возможно ли использовать нотрекинг (MergeOption.Нотрекинг) с элементом управления EntityDatSource?

#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. Это может быть сделано только с помощью отражения, потому что эти наборы объектов отображаются в производном экземпляре контекста как свойства. Такое отражение будет намного медленнее.