|
|
<#@ 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 = @"MovieDB.edmx";
|
|
|
EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
|
|
|
string namespaceName = code.VsNamespaceSuggestion();
|
|
|
|
|
|
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
|
|
|
WriteHeader(fileManager);
|
|
|
|
|
|
foreach (var entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
|
|
|
{
|
|
|
fileManager.StartNewFile(entity.Name + ".cs");
|
|
|
BeginNamespace(namespaceName, code);
|
|
|
#>
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
<#=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);
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
#>
|
|
|
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)
|
|
|
{
|
|
|
WriteNavigationProperty(code, navigationProperty);
|
|
|
}
|
|
|
}
|
|
|
#>
|
|
|
}
|
|
|
<#
|
|
|
EndNamespace(namespaceName);
|
|
|
}
|
|
|
|
|
|
foreach (var complex in ItemCollection.GetItems<ComplexType>().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();
|
|
|
|
|
|
#>
|
|
|
<#+
|
|
|
string GetResourceString(string resourceName)
|
|
|
{
|
|
|
if(_resourceManager == null)
|
|
|
{
|
|
|
_resourceManager = new System.Resources.ResourceManager("System.Data.Entity.Design", typeof(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly);
|
|
|
}
|
|
|
|
|
|
return _resourceManager.GetString(resourceName, null);
|
|
|
}
|
|
|
System.Resources.ResourceManager _resourceManager;
|
|
|
|
|
|
void WriteHeader(EntityFrameworkTemplateFileManager fileManager)
|
|
|
{
|
|
|
fileManager.StartHeader();
|
|
|
#>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<#+
|
|
|
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();
|
|
|
#>
|
|
|
}
|
|
|
<#+
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
|
|
|
{
|
|
|
WriteProperty(Accessibility.ForProperty(edmProperty),
|
|
|
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());
|
|
|
WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)),
|
|
|
navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
|
|
|
code.Escape(navigationProperty),
|
|
|
code.SpaceAfter(Accessibility.ForGetter(navigationProperty)),
|
|
|
code.SpaceAfter(Accessibility.ForSetter(navigationProperty)));
|
|
|
}
|
|
|
|
|
|
void WriteProperty(string accessibility, string type, string name, string getterAccessibility, string setterAccessibility)
|
|
|
{
|
|
|
#>
|
|
|
<#=accessibility#> <#=type#> <#=name#> { <#=getterAccessibility#>get; <#=setterAccessibility#>set; }
|
|
|
<#+
|
|
|
}
|
|
|
|
|
|
string PropertyVirtualModifier(string accessibility)
|
|
|
{
|
|
|
return accessibility + (accessibility != "private" ? " virtual" : "");
|
|
|
}
|
|
|
|
|
|
bool VerifyTypesAreCaseInsensitiveUnique(EdmItemCollection itemCollection)
|
|
|
{
|
|
|
var alreadySeen = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
|
|
|
foreach(var type in itemCollection.GetItems<StructuralType>())
|
|
|
{
|
|
|
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;
|
|
|
}
|
|
|
#>
|
|
|
|