(Visual Studio 2013 veya sonraki bir sürümünü kullanarak)
Modeli veritabanından her yenilediğinizde veya başka bir yolla kodun yeniden oluşturulmasını tetiklediğinizde EF modelinizdeki sınıf oluşturucunun düzenlenmesini önlemek için, değişikliği yapmak için uygun yer sorumlu olan T4 kod dosyasındadır. aslında model kodunu oluşturmak. Birkaç yıl önce, sınıfların ve özelliklerin gerçekte nasıl yaratıldığının altında yatan mekaniği anladığımda, dinamik özelliklerle ilgili başka bir sorun yaşadım. T4 !!! Bu ne bir mucize: -D T4 sözdizimi ilk başta biraz korkutucu olabilir, bu yüzden sözdizimini okumak akıllıca olacaktır. Değişiklik yaparken ÇOK odaklanmak da iyi bir fikir :-)
Yani! Modelinize bakarsanız, .edmx dosyanızın altında bir .tt dosyanız vardır. Bu .tt (T4) dosyası, aslında model sınıfınızı oluşturan komut dosyasıdır. Modelinizi her oluşturduğunuzda veya model düzenleyicide bazı değişiklikler yaptığınızda komut dosyası otomatik olarak çalıştırılacaktır.
Model tanımlayıcınızın Model1.edmx olarak adlandırıldığını varsayalım . Altındaki ağaçta Model1.Context.tt adlı bir dosyanız olacaktır . Ayrıca bir Model1.Context.cs dosyası göreceksiniz . Bu kesinlikle bağlamınız için gerçek kod dosyasıdır. Ancak bu dosya, çalıştırılan .tt komut dosyasının sonucudur ! Tamamen dinamik olarak yaratılmıştır. Yani onu düzenleme fikri yok.
.Tt dosyasını açın ve şöyle bir şey göreceksiniz:
<#@ 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 veya daha fazla satır aşağıya, kurucu kodu betik yazılıyor.
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;
Yapıcıdaki ilk satır olacak şekilde özelliği ekledim .
Dosyanızı kaydedin ve elde edilen kodu görmek için Model1.Context.cs dosyasını açın. Şablon komut dosyasını çalıştırmaya zorlamak istiyorsanız, menüyü seçin
Oluştur - Tüm T4 şablonlarını dönüştürün
T4 kodunuzda bir hata yapıp yapmadığınızı bilmek kolaydır, çünkü .cs dosyası ya hiç yapılmayacaktır ya da düzenleyicide açarsanız bariz hatalar olacaktır.