1 //---------------------------------------------------------------------
2 // <copyright file="ModelFunction.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
10 namespace System.Data.EntityModel.SchemaObjectModel
12 using System.Data.Entity;
13 using System.Data.Metadata.Edm;
14 using System.Diagnostics;
18 /// class representing the Schema element in the schema
20 internal sealed class ModelFunction : Function
22 private TypeUsageBuilder _typeUsageBuilder;
24 #region Public Methods
26 /// ctor for a schema function
28 public ModelFunction(Schema parentElement)
33 _typeUsageBuilder = new TypeUsageBuilder(this);
38 public override SchemaType Type
46 internal TypeUsage TypeUsage
50 if (_typeUsageBuilder.TypeUsage == null)
54 else if (CollectionKind != CollectionKind.None)
56 return TypeUsage.Create(new CollectionType(_typeUsageBuilder.TypeUsage));
60 return _typeUsageBuilder.TypeUsage;
65 internal void ValidateAndSetTypeUsage(ScalarType scalar)
67 _typeUsageBuilder.ValidateAndSetTypeUsage(scalar, false);
70 internal void ValidateAndSetTypeUsage(EdmType edmType)
72 _typeUsageBuilder.ValidateAndSetTypeUsage(edmType, false);
75 #region Protected Properties
76 protected override bool HandleElement(XmlReader reader)
78 if (base.HandleElement(reader))
82 else if (CanHandleElement(reader, XmlConstants.DefiningExpression))
84 HandleDefiningExpressionElment(reader);
87 else if (CanHandleElement(reader, XmlConstants.Parameter))
89 HandleParameterElement(reader);
96 protected override void HandleReturnTypeAttribute(XmlReader reader)
98 base.HandleReturnTypeAttribute(reader);
102 protected override bool HandleAttribute(XmlReader reader)
104 if (base.HandleAttribute(reader))
108 else if (_typeUsageBuilder.HandleAttribute(reader))
116 internal override void ResolveTopLevelNames()
118 if (null != UnresolvedReturnType)
120 if (Schema.ResolveTypeName(this, UnresolvedReturnType, out _type))
122 if (_type is ScalarType)
124 _typeUsageBuilder.ValidateAndSetTypeUsage(_type as ScalarType, false);
130 foreach (Parameter parameter in this.Parameters)
132 parameter.ResolveTopLevelNames();
135 if (ReturnTypeList != null)
137 Debug.Assert(ReturnTypeList.Count == 1, "returnTypeList should always be non-empty. Multiple ReturnTypes are only possible on FunctionImports.");
138 ReturnTypeList[0].ResolveTopLevelNames();
143 private void HandleDefiningExpressionElment(XmlReader reader)
145 Debug.Assert(reader != null);
147 FunctionCommandText commandText = new FunctionCommandText(this);
148 commandText.Parse(reader);
149 _commandText = commandText;
152 internal override void Validate()
156 ValidationHelper.ValidateFacets(this, _type, _typeUsageBuilder);
160 ValidationHelper.ValidateRefType(this, _type);