(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
Buduj - przekształcaj wszystkie szablony T4
Ł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.