2012-10-13 9 views
10

Zamiast robić co następuje przy każdym zapytaniu, czy istnieje sposób, aby ustawić tę wartość globalnie? W widoku modelu istnieje ustawienie leniwego ładowania, ale nie wydaje się, aby było to ustawienie dla ProxyCreation.Trwale wyłączyć Configuration.ProxyCreationEnabled w EF?

 using (var context = new LabEntities()) 
     { 
      **context.Configuration.ProxyCreationEnabled = false;** 

      var Query = from s in context.EAssets 
         .Include("Server").Include("Type").Include("Type.Definition") 
         where (s.Type.Definition.b_IsScannable == true) && 
         (s.Server.s_Domain == Environment.UserDomainName || s.Server.s_Domain == null) 
         select s; 
      var Entities = Query.ToList(); 
     } 

nie w pełni zrozumieć korzyści płynące z tej opcji, ale wiem, że w visual studio jest tags wszystkie moje obiektów z bełkotem przyrostków szeregowych i sprawia, że ​​za pomocą debuggera nierozsądne.

Odpowiedz

20

Można ją wyłączyć w konstruktorze, tak że zostaje ona wyłączona w każdej chwili utworzyć nowy kontekst:

public class LabEntities : DbContext 
{ 
    public LabEntities() 
    { 
     Configuration.ProxyCreationEnabled = false; 
    } 
} 
+7

Co z problemem dotyczącym reguowania automatycznego generowania plików, który występuje po odświeżeniu modelu? Czy ręczne zmiany nie zostaną wydane? – jwrightmail

+0

Jaki problem z automatycznym generowaniem plików? –

+1

Aby wyłączyć to w konstruktorze, musisz edytować plik generowany automatycznie. W moim przypadku jego datamodel.context.cs. // Ten kod został wygenerowany z szablonu. // // Ręczne zmiany w tym pliku mogą spowodować nieoczekiwane zachowanie w aplikacji. // Ręczne zmiany w tym pliku zostaną nadpisane, jeśli kod zostanie zregenerowany. // jwrightmail

15

Jeśli używasz podejście modelu pierwszego, czyli masz .edmx pliku sposobem na trwałe wyłączenie tej opcji jest zmodyfikowanie pliku .Context.tt. Ten plik jest szablonem generowania kodu, którego proces budowania używa do generowania klasy pochodnej DbContext.

Otwórz ten plik i znajdź konstruktora:

public <#=Code.Escape(container)#>() 
     : base("name=<#=container.Name#>") 
    { 
<# 
     WriteLazyLoadingEnabled(container); 
#> 
     //add the following line of code 

     this.Configuration.ProxyCreationEnabled = false; 
    } 

następnie dodaj linię kodu, aby ustawić tę właściwość na wartość false. Przebuduj swój projekt i sprawdź, czy wygenerowany kontekst zawiera linię.

+2

To jest poprawna odpowiedź według mnie. Bądź jednak ostrożny, jeśli uaktualnisz Entity Framework w przyszłości, ponieważ może on zastąpić twoje zmiany w pliku .tt. (O ile się nie mylę?) – rwalter

+0

Zawsze się nad tym zastanawiałem ... Chciałbym zobaczyć odpowiedź, która rozszerza generowaną klasę cząstkową za pomocą DbContext (która nie definiuje 'OnContextCreated'). – seebiscuit

Powiązane problemy