<#@ template language="C#" debug="false" hostspecific="true"#> <#@ include file="EF.Utility.CS.ttinclude"#><#@ output extension=".cs"#><# CodeGenerationTools code = new CodeGenerationTools(this); MetadataLoader loader = new MetadataLoader(this); CodeRegion region = new CodeRegion(this, 1); MetadataTools ef = new MetadataTools(this); string inputFile = @"EMISContext.edmx"; EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile); string namespaceName = code.VsNamespaceSuggestion(); EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this); WriteHeader(fileManager); string summary=string.Empty; foreach (EntityType entity in ItemCollection.GetItems().OrderBy(e => e.Name)) { fileManager.StartNewFile(entity.Name + ".cs"); BeginNamespace(namespaceName, code); if(entity.Documentation !=null && entity.Documentation.Summary!=null) summary=entity.Documentation.Summary; else summary=entity.Name; #> #pragma warning disable 1573 using System; using System.Collections.Generic; /// /// <#=summary#> /// <#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#> { <# var propertiesWithDefaultValues = entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity && p.DefaultValue != null); var collectionNavigationProperties = entity.NavigationProperties.Where(np => np.DeclaringType == entity && np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many); var complexProperties = entity.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == entity); var dupPropertyTypes = entity.NavigationProperties.GroupBy(x => code.Escape(x.ToEndMember.GetEntityType())).Where(x => x.Count() > 1).Select(x => x.Key).ToList(); if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any()) { #> public <#=code.Escape(entity)#>() { <# foreach (var edmProperty in propertiesWithDefaultValues) { #> this.<#=code.Escape(edmProperty)#> = <#=code.CreateLiteral(edmProperty.DefaultValue)#>; <# } foreach (var navigationProperty in collectionNavigationProperties) { if (dupPropertyTypes.Contains(code.Escape(navigationProperty.ToEndMember.GetEntityType()))) { #> this.<#=navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? (((AssociationType)navigationProperty.RelationshipType).IsForeignKey ? code.Escape(code.Escape(navigationProperty.ToEndMember.GetEntityType()) + "_" + GetRelationPropertyName(navigationProperty, loader, inputFile)) : code.Escape(((AssociationType)navigationProperty.RelationshipType).Name) ) : code.Escape(GetRelationPropertyName(navigationProperty, loader, inputFile) + "_Nav")#> = new HashSet<<#=code.Escape(navigationProperty.ToEndMember.GetEntityType())#>>(); <# } else { #> this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=code.Escape(navigationProperty.ToEndMember.GetEntityType())#>>(); <# } } foreach (var complexProperty in complexProperties) { #> this.<#=code.Escape(complexProperty)#> = new <#=code.Escape(complexProperty.TypeUsage)#>(); <# } #> } <# } var primitiveProperties = entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity); if (primitiveProperties.Any()) { foreach (var edmProperty in primitiveProperties) { WriteProperty(code, edmProperty); } } if (complexProperties.Any()) { #> <# foreach(var complexProperty in complexProperties) { WriteProperty(code, complexProperty); } } var navigationProperties = entity.NavigationProperties.Where(np => np.DeclaringType == entity); if (navigationProperties.Any()) { #> <# foreach (var navigationProperty in navigationProperties) { if (dupPropertyTypes.Contains(code.Escape(navigationProperty.ToEndMember.GetEntityType()))) { WriteNavigationPropertyByName(code, navigationProperty, loader, inputFile); } else { WriteNavigationProperty(code, navigationProperty); } } } #> } <# EndNamespace(namespaceName); } foreach (var complex in ItemCollection.GetItems().OrderBy(e => e.Name)) { fileManager.StartNewFile(complex.Name + ".cs"); BeginNamespace(namespaceName, code); #> using System; <#=Accessibility.ForType(complex)#> partial class <#=code.Escape(complex)#> { <# var complexProperties = complex.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == complex); var propertiesWithDefaultValues = complex.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == complex && p.DefaultValue != null); if (propertiesWithDefaultValues.Any() || complexProperties.Any()) { #> public <#=code.Escape(complex)#>() { <# foreach (var edmProperty in propertiesWithDefaultValues) { #> this.<#=code.Escape(edmProperty)#> = <#=code.CreateLiteral(edmProperty.DefaultValue)#>; <# } foreach (var complexProperty in complexProperties) { #> this.<#=code.Escape(complexProperty)#> = new <#=code.Escape(complexProperty.TypeUsage)#>(); <# } #> } <# } var primitiveProperties = complex.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == complex); if (primitiveProperties.Any()) { foreach(var edmProperty in primitiveProperties) { WriteProperty(code, edmProperty); } } if (complexProperties.Any()) { #> <# foreach(var edmProperty in complexProperties) { WriteProperty(code, edmProperty); } } #> } <# EndNamespace(namespaceName); } if (!VerifyTypesAreCaseInsensitiveUnique(ItemCollection)) { return ""; } fileManager.Process(); #> <#+ void WriteHeader(EntityFrameworkTemplateFileManager fileManager) { fileManager.StartHeader(); #> //------------------------------------------------------------------------------ // // This code was generated from a template. // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. // //------------------------------------------------------------------------------ <#+ fileManager.EndBlock(); } void BeginNamespace(string namespaceName, CodeGenerationTools code) { CodeRegion region = new CodeRegion(this); if (!String.IsNullOrEmpty(namespaceName)) { #> namespace <#=code.EscapeNamespace(namespaceName)#> { <#+ PushIndent(CodeRegion.GetIndent(1)); } } void EndNamespace(string namespaceName) { if (!String.IsNullOrEmpty(namespaceName)) { PopIndent(); #> } <#+ } } string GetRelationPropertyName(NavigationProperty relationProperty, MetadataLoader loader, string inputFile) { if (((AssociationType)relationProperty.RelationshipType).IsForeignKey) { MetadataWorkspace metadataWorkspace = null; bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace); var association = metadataWorkspace .GetItems(DataSpace.SSpace) .Single(a => a.Name == relationProperty.RelationshipType.Name); return string.Join("_", association.ReferentialConstraints.SelectMany(rc => rc.ToProperties)); } else { return relationProperty.Name; } } void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty) { if (edmProperty.Documentation != null && edmProperty.Documentation.Summary != null) { WriteProperty(Accessibility.ForProperty(edmProperty), code.Escape(edmProperty.Documentation.Summary), code.Escape(edmProperty.TypeUsage), code.Escape(edmProperty), code.SpaceAfter(Accessibility.ForGetter(edmProperty)), code.SpaceAfter(Accessibility.ForSetter(edmProperty))); } else { WriteProperty(Accessibility.ForProperty(edmProperty), code.Escape(edmProperty.Name), code.Escape(edmProperty.TypeUsage), code.Escape(edmProperty), code.SpaceAfter(Accessibility.ForGetter(edmProperty)), code.SpaceAfter(Accessibility.ForSetter(edmProperty))); } } void WriteNavigationProperty(CodeGenerationTools code, NavigationProperty navigationProperty) { var endType = code.Escape(navigationProperty.ToEndMember.GetEntityType()); if (navigationProperty.Documentation != null && navigationProperty.Documentation.Summary != null) { WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)), code.Escape(navigationProperty.Documentation.Summary), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("HashSet<" + endType + ">") : endType, code.Escape(navigationProperty), code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); } else { WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)), code.Escape(navigationProperty.Name), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("HashSet<" + endType + ">") : endType, code.Escape(navigationProperty), code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); } } void WriteNavigationPropertyByName(CodeGenerationTools code, NavigationProperty navigationProperty, MetadataLoader loader, string inputFile) { var endType = code.Escape(navigationProperty.ToEndMember.GetEntityType()); if (navigationProperty.Documentation != null && navigationProperty.Documentation.Summary != null) { WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)), code.Escape(navigationProperty.Documentation.Summary), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("HashSet<" + endType + ">") : endType, navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? (((AssociationType)navigationProperty.RelationshipType).IsForeignKey ? code.Escape(code.Escape(navigationProperty.ToEndMember.GetEntityType()) + "_" + GetRelationPropertyName(navigationProperty, loader, inputFile)) : code.Escape(((AssociationType)navigationProperty.RelationshipType).Name) ) : code.Escape(GetRelationPropertyName(navigationProperty, loader, inputFile) + "_Nav"), code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); } else { WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)), code.Escape(navigationProperty.Name), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("HashSet<" + endType + ">") : endType, navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? (((AssociationType)navigationProperty.RelationshipType).IsForeignKey ? code.Escape(code.Escape(navigationProperty.ToEndMember.GetEntityType()) + "_" + GetRelationPropertyName(navigationProperty, loader, inputFile)) : code.Escape(((AssociationType)navigationProperty.RelationshipType).Name) ) : code.Escape(GetRelationPropertyName(navigationProperty, loader, inputFile) + "_Nav"), code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); } } void WriteProperty(string accessibility, string summary, string type, string name, string getterAccessibility, string setterAccessibility) { #> /// /// <#=summary#> /// <#=accessibility#> <#=type#> <#=name#> { <#=getterAccessibility#>get; <#=setterAccessibility#>set; } <#+ } string PropertyVirtualModifier(string accessibility) { return accessibility + (accessibility != "private" ? " virtual" : ""); } bool VerifyTypesAreCaseInsensitiveUnique(EdmItemCollection itemCollection) { var alreadySeen = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach(var type in itemCollection.GetItems()) { if (!(type is EntityType || type is ComplexType)) { continue; } if (alreadySeen.ContainsKey(type.FullName)) { Error(String.Format(CultureInfo.CurrentCulture, "This template does not support types that differ only by case, the types {0} are not supported", type.FullName)); return false; } else { alreadySeen.Add(type.FullName, true); } } return true; } #>