Jedyny sposób, że moja usługa WCF może powrócić zajęcia z kodem pierwszego modelu jest ustawienie ProxyCreationEnable
do false
stosując poniższy kod.
((IObjectContextAdapter)MyDb).ObjectContext.ContextOptions.ProxyCreationEnable = false;
Jakie są negatywne konsekwencje takiego postępowania? Jedną z korzyści jest to, że mogę przynajmniej uzyskać serializację tych typów dynamicznych, aby można je było przesyłać za pośrednictwem sieci kablowej za pomocą WCF.
źródło
Jeśli
DbContext.Configuration.ProxyCreationEnabled
jest ustawiona nafalse
, DbContext nie załaduje obiektów podrzędnych dla niektórych obiektów nadrzędnych, chyba żeInclude
metoda zostanie wywołana na obiekcie nadrzędnym. UstawianieDbContext.Configuration.LazyLoadingEnabled
siętrue
lubfalse
nie będzie miało wpływu na jego zachowanie.Jeśli
DbContext.Configuration.ProxyCreationEnabled
jest ustawiona natrue
, obiekty podrzędne będą ładowane automatycznie, aDbContext.Configuration.LazyLoadingEnabled
wartość będzie sterować ładowaniem obiektów podrzędnych.źródło
Gdy używasz EF, domyślnie tworzy serwer proxy dla Twojej klasy. Rozwiązaniem może być dodanie tego wiersza w konstruktorze klasy DbContext. Twój model danych odziedziczony z klasy DbContext, więc możesz edytować model w następujący sposób:
public yourDataModelEntities() : base("name=yourDataModelEntities") { base.Configuration.ProxyCreationEnabled = false; }
Ta klasa jest w twoim
EF.edmx
wtedy wyourmodel.Context.tt
wtedyyourmodel.Context.cs
źródło
(Korzystanie z programu Visual Studio 2013 lub nowszego)
Aby uniknąć edycji konstruktora klasy w modelu EF za każdym razem, gdy odświeżasz model z bazy danych lub w inny sposób wyzwalasz przebudowę kodu, właściwym miejscem do wprowadzenia zmiany jest plik kodu T4, który jest odpowiedzialny za faktycznie tworząc kod modelu. Miałem inny problem z właściwościami dynamicznymi kilka lat temu, kiedy zrozumiałem podstawową mechanikę tworzenia klas i właściwości. T4 !!! Cóż to za cud :-D Składnia T4 może na początku nieco onieśmielać, więc czytanie składni jest mądre. Bycie BARDZO skupionym na wprowadzaniu zmian jest również dobrym pomysłem :-)
Więc! Jeśli zajrzysz do swojego modelu, masz plik .tt pod plikiem .edmx. Ten plik .tt (T4) jest skryptem, który faktycznie tworzy klasę modelu. Skrypt będzie uruchamiany automatycznie za każdym razem, gdy będziesz budować model lub wprowadzać zmiany w edytorze modelu.
Powiedzmy, że twój deskryptor modelu nosi nazwę Model1.edmx . Będziesz mieć plik o nazwie Model1.Context.tt w drzewie pod nim. Zobaczysz również plik Model1.Context.cs . Jest to oczywiście rzeczywisty plik kodu dla twojego kontekstu. Ale ten plik jest wynikiem działania skryptu .tt ! Jest tworzony całkowicie dynamicznie. Więc nie ma pomysłu, żeby go edytować.
Otwórz plik .tt, a zobaczysz coś takiego:
<#@ 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); .. ..
Kolejne 50 linii w dół, kod konstruktora jest w trakcie tworzenia skryptów.
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; <# }
Dodałem tę właściwość
base.Configuration.ProxyCreationEnabled = false;
, aby była to pierwsza linia w konstruktorze.Zapisz plik i otwórz plik Model1.Context.cs, aby wyświetlić wynikowy kod. Jeśli chcesz wymusić uruchomienie skryptu szablonu, wybierz menu
Łatwo jest wiedzieć, czy popełniłeś błąd w swoim kodzie T4, ponieważ plik .cs albo w ogóle nie zostanie utworzony, albo z oczywistymi błędami, jeśli otworzysz go w edytorze.
źródło