(दृश्य स्टूडियो 2013 या उसके बाद का उपयोग करना)
हर बार जब आप डेटाबेस से मॉडल को रिफ्रेश करते हैं, या किसी अन्य तरीके से कोड के पुनर्निर्माण को ट्रिगर करते हैं, तो E4 मॉडल में क्लास कंस्ट्रक्टर के संपादन से बचने के लिए, परिवर्तन करने के लिए उचित स्थान T4 कोड फ़ाइल में है जो कि जिम्मेदार है वास्तव में मॉडल कोड बनाना। मेरे पास कुछ साल पहले गतिशील गुणों के साथ कुछ अन्य मुद्दा था जब मैंने अंतर्निहित यांत्रिकी को समझा कि कैसे कक्षाएं और गुण वास्तव में बनाए गए थे। टी -4 !!! यह एक चमत्कार क्या है: -D T4 सिंटैक्स पहली बार में थोड़ा डराने वाला हो सकता है, इसलिए सिंटैक्स पर पढ़ना समझदारी है। परिवर्तन करते समय बहुत ध्यान केंद्रित करना भी एक अच्छा विचार है :-)
इसलिए! यदि आप अपने मॉडल में देखते हैं, तो आपके पास .edmx फ़ाइल के अंतर्गत एक .tt फ़ाइल है। यह .tt (T4) फ़ाइल वह स्क्रिप्ट है जो वास्तव में आपका मॉडल वर्ग बनाती है। प्रत्येक बार जब आप अपना मॉडल बनाते हैं या मॉडल संपादक में कुछ बदलाव करते हैं, तो स्क्रिप्ट स्वचालित रूप से चलाई जाएगी।
मान लीजिए कि आपके मॉडल विवरणक का नाम Model1.edmx है । आपके पास पेड़ के नीचे Model1.Context.tt नाम की एक फ़ाइल होगी । आपको एक Model1.Context.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.Context.cs फ़ाइल खोलें। यदि आप टेम्पलेट स्क्रिप्ट को चलाने के लिए बाध्य करना चाहते हैं, तो मेनू का चयन करें
बिल्ड - सभी T4 टेंपरेचर को ट्राँफॉर्म करें
यह जानना आसान है कि क्या आपने अपने T4 कोड में कोई गलती की है, क्योंकि .cs फ़ाइल या तो बिल्कुल भी नहीं बनाई जाएगी, या यदि आप इसे संपादक में खोलते हैं तो स्पष्ट त्रुटियों के साथ।