Каковы минусы отключения ProxyCreationEnabled для CTP5 кода EF

Единственный способ, которым моя служба WCF может возвращать classы из первой модели кода, – это установить ProxyCreationEnable в false используя приведенный ниже код.

 ((IObjectContextAdapter)MyDb).ObjectContext.ContextOptions.ProxyCreationEnable = false; 

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

Динамические прокси используются для отслеживания изменений и ленивой загрузки. Когда WCF пытается сериализовать объект, связанный контекст обычно закрывается и удаляется, но сериализация свойств навигации автоматически вызывает ложную загрузку (в закрытом контексте) => исключение.

Если вы отключите ленивую загрузку, вам нужно будет использовать желаемую загрузку для всех свойств навигации, которые вы хотите использовать (Include on ObjectQuery). Изменения отслеживания не работают над WCF, он работает только для модификации объекта, который привязан к ObjectContext.

Если для параметра DbContext.Configuration.ProxyCreationEnabled установлено значение false , DbContext не будет загружать дочерние объекты для какого-либо родительского объекта, если для родительского объекта вызывается метод Include . Установка DbContext.Configuration.LazyLoadingEnabled на true или false не повлияет на его поведение.

Если для параметра DbContext.Configuration.ProxyCreationEnabled установлено значение true , дочерние объекты будут загружаться автоматически, а значение DbContext.Configuration.LazyLoadingEnabled будет контролироваться при загрузке дочерних объектов.

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

  public yourDataModelEntities() : base("name=yourDataModelEntities") { base.Configuration.ProxyCreationEnabled = false; } 

Этот class находится в вашем EF.edmx затем в yourmodel.Context.tt затем yourmodel.Context.cs

(С использованием Visual Studio 2013 или более поздней версии)

Чтобы избежать редактирования конструктора classов в вашей модели EF каждый раз, когда вы обновляете модель из базы данных или каким-либо другим способом инициируете перестройку кода, правильное место для внесения изменений находится в файле кода T4, который отвечает за фактически создавая код модели. У меня была еще одна проблема с динамическими свойствами несколько лет назад, когда я понял основную механику того, как были созданы classы и свойства. T4 !!! Какое чудо это: -D T4 синтаксис может быть немного запугивающим вначале, поэтому чтение синтаксиса является разумным. ОЧЕНЬ сфокусированный при внесении изменений – тоже хорошая идея 🙂

Так! Если вы посмотрите в своей модели, у вас есть файл .tt под вашим .edmx-файлом. Этот файл .tt (T4) – это скрипт, который фактически создает class модели. Сценарий будет запускаться автоматически каждый раз, когда вы создадите свою модель или внесите некоторые изменения в редактор модели.

Скажем, ваш дескриптор модели называется Model1.edmx . У вас будет файл с именем Model1.Context.tt в дереве под ним. Вы также увидите файл Model1.Context.cs . Это, очевидно, фактический файл кода для вашего контекста. Но этот файл является результатом запуска файла сценария .tt ! Он полностью динамически создан. Так что не стоит его редактировать.

Откройте файл .tt, и вы увидите что-то вроде:

 <#@ template language="C#" debug="false" hostspecific="true"#> <#@ include file="EF6.Utility.CS.ttinclude"#><#@ output extension=".cs"#><# const string inputFile = @"Model1.edmx"; var textTransform = DynamicTextTransformation.Create(this); .. .. 

Еще около 50 строк вниз, код конструктора запускается сценарием.

 using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; <# if (container.FunctionImports.Any()) { #> using System.Data.Entity.Core.Objects; using System.Linq; <# } #> <#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext { public <#=code.Escape(container)#>() : base("name=<#=container.Name#>") { base.Configuration.ProxyCreationEnabled = false; <# if (!loader.IsLazyLoadingEnabled(container)) { #> this.Configuration.LazyLoadingEnabled = false; <# } 

Я добавил base.Configuration.ProxyCreationEnabled = false; свойств. base.Configuration.ProxyCreationEnabled = false; так что это будет первая строка в конструкторе.

Сохраните файл и откройте файл Model1.Context.cs, чтобы увидеть полученный код. Если вы хотите принудительно запустить сценарий шаблона, выберите меню

Build - Tranform все шаблоны T4

Легко узнать, допустили ли вы ошибку в коде T4, так как файл .cs будет либо вообще не создан, либо с явными ошибками, если вы откроете его в редакторе.

  • Json.Net добавляет $ id к объектам EF, несмотря на то, что PreserveReferencesHandling указывает на "None"
  • ADO.NET Генератор DbContext или ADO.NET Poco Entity Generator (ObjectContext)
  • Код Framework Entity Сначала: как комментировать внешний ключ для значения «По умолчанию»?
  • Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
  • Отключить ленивую загрузку по умолчанию в Entity Framework 4
  • Interesting Posts

    Вибрация с длительностью и узором

    TableView не фиксирует значения по событию, потерянному фокусом

    Запуск приложения несколько раз из Pinned Shortcut

    Получение относительного виртуального пути с физического пути

    Разница между одиночными и двойными кавычками в Bash

    Эквивалент AssemblyInfo в ядре dotnet / csproj

    Имя classа Java, содержащее знак доллара, не может быть скомпилировано, если присутствует внутренний class

    Измененная память Windows без файла подкачки

    Как найти IP-адрес моего Asus RT-AC86U в режиме точки доступа?

    Есть ли способ показать уведомление из сценария bash в Ubuntu?

    Как я могу определить, какую именно версию сервера Exchange я подключаю к Outlook?

    Использование Reshape с широким и длинным в R

    Как работает localhost 127.0.0.1?

    Совокупная функция SQL для захвата только первой из каждой группы

    Как показать / скрыть элемент на флажке проверенных / непроверенных состояний с помощью jQuery?

    Давайте будем гением компьютера.