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


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

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

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

4 79

4 ответа:

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

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

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

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

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

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

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

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

чтобы избежать редактирования конструктора класса в вашей модели EF каждый раз, когда вы обновляете модель из базы данных или каким-либо другим способом запускаете перестройку кода, правильное место для внесения изменений находится в файле кода T4, который отвечает за фактическое создание кода модели. У меня была другая проблема с динамическими свойствами несколько лет назад, когда я понял основную механику того, как классы и свойства были на самом деле создан. Т4!!! Какое это чудо: - D Синтаксис T4 может быть немного пугающим сначала, поэтому чтение синтаксиса является мудрым. Быть очень сосредоточенным при внесении изменений также хорошая идея : -)

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

Допустим, ваша модель дескриптор называется Model1.edmx. У вас будет файл с именемModel1.Context.tt в дереве под ним. Вы также увидите Model1.Контекст.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; Так, что это будет самая первая строка в конструкторе.

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

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

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