स्ट्रक्चरल एनोटेशन - अच्छा। मैंने पहली बार इस फीचर के बारे में सुना है लेकिन यह काम करता है। मैंने अभी कोशिश की। मैं इसे थोड़ा समझाने की कोशिश करूंगा।
स्ट्रक्चरल एनोटेशन ईडीएमएक्स फ़ाइल में जोड़े गए यादृच्छिक एक्सएमएल हैं। ईडीएमएक्स फाइल वास्तव में सिर्फ एक्सएमएल है जिसमें 4 भाग होते हैं - सीएसडीएल, एमएसएल, एसएसडीएल और डिजाइनर में पोजिशनिंग तत्वों से संबंधित भाग।
- CSDL संस्थाओं के बीच संस्थाओं और संघों का वर्णन करता है (डिजाइनर में परिभाषित)
- SSDL तालिकाओं और संबंधों का वर्णन करता है
- MSL CSDL और SSDL के बीच मैपिंग का वर्णन करता है
यदि आप पहले मॉडल से शुरू करते हैं (आप अपने मॉडल से डेटाबेस जेनरेट करना चाहते हैं), तो आपके पास केवल सीएसडीएल हिस्सा है और एसएसडीएल और एमएसएल दोनों कुछ स्वचालित प्रक्रिया (वर्कफ़्लो में निष्पादित टी 4 टेम्पलेट्स) द्वारा उत्पन्न होंगे, एक बार एसएसडीएल बनने के बाद एक और टी 4 टेम्पलेट उत्पन्न होगा डेटाबेस निर्माण के लिए SQL स्क्रिप्ट।
लिंक किए गए MSDN फ़ोरम के थ्रेड में वर्णित स्ट्रक्चरल एनोटेशन एक संकेत है। आप ईडीएमएक्स के सीएसडीएल भाग में संरचनात्मक एनोटेशन रखेंगे (आपको ईडीएमएक्स को एक्सएमएल के रूप में खोलना होगा - समाधान एक्सप्लोरर में फ़ाइल पर क्लिक करें और इसके साथ खोलें चुनें)। मेरा परीक्षण CSDL तीन गुणों के साथ एकल उपयोगकर्ता इकाई का वर्णन करता है (उत्तर में बाद में स्क्रीनशॉट पर इकाई दिखाई देती है):
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm"
xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"
xmlns:custom="http://tempuri.org/custom"
Namespace="Model" Alias="Self" >
<EntityContainer Name="ModelContainer" annotation:LazyLoadingEnabled="true">
<EntitySet Name="UsersSet" EntityType="Model.User" />
</EntityContainer>
<EntityType Name="User">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="String" Name="Login" Nullable="false" />
<Property Type="DateTime" Name="CreatedAt" Nullable="false">
<custom:SqlType edmx:CopyToSSDL="true">Date</custom:SqlType>
</Property>
</EntityType>
</Schema>
</edmx:ConceptualModels>
मैंने Schema
. में कस्टम नेमस्पेस परिभाषा जोड़ी है तत्व:xmlns:custom="http://tempuri.org/custom"
और CreatedAt
. के लिए परिभाषित कस्टम संरचनात्मक एनोटेशन संपत्ति:
<Property Type="DateTime" Name="CreatedAt" Nullable="false">
<custom:SqlType edmx:CopyToSSDL="true">Date</custom:SqlType>
</Property>
संरचनात्मक एनोटेशन के लिए उपयोग किए जाने वाले नाम स्थान या तत्व का नाम महत्वपूर्ण नहीं है - यह बिल्कुल आप पर निर्भर करता है कि आप किन नामों का उपयोग करते हैं। केवल महत्वपूर्ण चीज है edmx:CopyToSSDL="true"
विशेषता। इस विशेषता को SSDL निर्माण के लिए उपयोग किए गए T4 टेम्पलेट द्वारा पहचाना जाता है और यह केवल इस तत्व को लेता है और इसे SSDL में रखता है। उत्पन्न SSDL ऐसा दिखता है:
<Schema Namespace="Model.Store" Alias="Self"
Provider="System.Data.SqlClient" ProviderManifestToken="2008"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="ModelStoreContainer">
<EntitySet Name="UsersSet" EntityType="Model.Store.UsersSet" store:Type="Tables" Schema="dbo" />
</EntityContainer>
<EntityType Name="UsersSet">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="Login" Type="nvarchar(max)" Nullable="false" />
<Property Name="CreatedAt" Type="datetime" Nullable="false">
<custom:SqlType xmlns:custom="http://tempuri.org/custom">Date</custom:SqlType>
</Property>
</EntityType>
</Schema>
एकमात्र बिंदु संरचनात्मक एनोटेशन को एसएसडीएल में ले जा रहा था। सभी एनोटेशन मेटाडेटा में कुछ नाम मान संग्रह के माध्यम से सुलभ हैं। अब आपको इस एनोटेशन को पहचानने और संपत्ति में परिभाषित प्रकार के बजाय एनोटेशन में परिभाषित मान का उपयोग करने के लिए SQL स्क्रिप्ट पीढ़ी के लिए जिम्मेदार T4 टेम्पलेट को संशोधित करने की आवश्यकता है। आप टेम्पलेट को इसमें पा सकते हैं:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\SSDLToSQL10.tt
टेम्पलेट फ़ाइल को नए स्थान पर कॉपी करें (ताकि आप मूल को संशोधित न करें) और इसके साथ डिफ़ॉल्ट तालिका निर्माण को बदलें:
-- Creating table '<#=tableName#>'
CREATE TABLE <# if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=tableName#>] (
<#
for (int p = 0; p < entitySet.ElementType.Properties.Count; p++)
{
EdmProperty prop = entitySet.ElementType.Properties[p];
#>
[<#=Id(prop.Name)#>] <#
if (prop.MetadataProperties.Contains("http://tempuri.org/custom:SqlType"))
{
MetadataProperty annotationProperty = prop.MetadataProperties["http://tempuri.org/custom:SqlType"];
XElement e = XElement.Parse(annotationProperty.Value.ToString());
string value = e.Value.Trim();
#>
<#=value#> <# } else { #> <#=prop.ToStoreType()#> <# } #> <#=WriteIdentity(prop, targetVersion)#> <#=WriteNullable(prop.Nullable)#><#=(p < entitySet.ElementType.Properties.Count - 1) ? "," : ""#>
<#
}
#>
);
GO
अब अंतिम बिंदु SQL स्क्रिप्ट पीढ़ी के लिए उपयोग किए जाने वाले टेम्पलेट को बदल रहा है। डिज़ाइनर में EDMX फ़ाइल खोलें और मॉडल के गुणों पर जाएँ (जब आपके पास गुण विंडो खुली हो तो डिज़ाइनर में कहीं क्लिक करें)। डीडीएल जनरेशन टेम्प्लेट को आपके द्वारा संशोधित टेम्प्लेट में बदलें।
मॉडल से डेटाबेस जेनरेट करें Run चलाएं और यह निम्न युक्त SQL स्क्रिप्ट बनाएगा:
-- Creating table 'UsersSet'
CREATE TABLE [dbo].[UsersSet] (
[Id] int IDENTITY(1,1) NOT NULL,
[Login] nvarchar(max) NOT NULL,
[CreatedAt] Date NOT NULL
);
GO
यह शायद ईडीएमएक्स की सबसे उन्नत और छिपी हुई विशेषता है जिसे मैंने अभी तक देखा है। कस्टम T4 टेम्प्लेट के साथ एनोटेशन आपको क्लास और SQL जेनरेशन दोनों पर बहुत अधिक नियंत्रण दिला सकते हैं। मैं पहले मॉडल का उपयोग करते समय डेटाबेस इंडेक्स या अद्वितीय कुंजी को परिभाषित करने के लिए इसका उपयोग करने की कल्पना कर सकता हूं या जेनरेट किए गए पीओसीओ कक्षाओं में चुनिंदा कुछ कस्टम विशेषताओं को जोड़ सकता हूं।
इसके इतने छिपे होने का कारण यह है कि इसका उपयोग करने के लिए वीएस आउट-ऑफ-द-बॉक्स में कोई टूलिंग सपोर्ट नहीं है।