Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Design / system / Data / EntityModel / Emitters / NavigationPropertyEmitter.cs / 1305376 / NavigationPropertyEmitter.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.CodeDom; using System.Collections.Generic; using System.Data.Metadata.Edm; using System.Data.Services.Design; using System.Diagnostics; namespace System.Data.EntityModel.Emitters { ////// Summary description for NavigationPropertyEmitter. /// internal sealed class NavigationPropertyEmitter : PropertyEmitterBase { private const string ValuePropertyName = "Value"; ////// /// /// /// public NavigationPropertyEmitter(ClientApiGenerator generator, NavigationProperty navigationProperty, bool declaringTypeUsesStandardBaseType) : base(generator, navigationProperty, declaringTypeUsesStandardBaseType) { } ////// Generate the navigation property /// /// The type to add the property to. protected override void EmitProperty(CodeTypeDeclaration typeDecl) { EmitNavigationProperty(typeDecl); } ////// Generate the navigation property specified /// /// The type to add the property to. private void EmitNavigationProperty(CodeTypeDeclaration typeDecl) { // create a regular property CodeMemberProperty property = EmitNavigationProperty(Item.ToEndMember); typeDecl.Members.Add(property); EmitField(typeDecl, GetReturnType(Item.ToEndMember), Item.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many); } private void EmitField(CodeTypeDeclaration typeDecl, CodeTypeReference fieldType, bool hasDefault) { CodeMemberField memberField = new CodeMemberField(fieldType, Utils.FieldNameFromPropName(Item.Name)); memberField.Attributes = MemberAttributes.Private; AttributeEmitter.AddGeneratedCodeAttribute(memberField); if (hasDefault) { if (this.Generator.UseDataServiceCollection) { // new DataServiceCollection(null, System.Data.Services.Client.TrackingMode.None, null, null, null); // declare type is DataServiceCollection Debug.Assert(fieldType.TypeArguments.Count == 1, "Declare type is non generic."); // new DataServiceCollection<[type]>(null, TrackingMode.None) memberField.InitExpression = new CodeObjectCreateExpression( fieldType, new CodePrimitiveExpression(null), new CodeFieldReferenceExpression( new CodeTypeReferenceExpression(typeof(System.Data.Services.Client.TrackingMode)), "None")); } else { memberField.InitExpression = new CodeObjectCreateExpression(fieldType); } } typeDecl.Members.Add(memberField); } /// /// Generate a navigation property /// /// the other end /// True to emit Reference navigation property ///the generated property private CodeMemberProperty EmitNavigationProperty(RelationshipEndMember target) { CodeTypeReference typeRef = GetReturnType(target); // raise the PropertyGenerated event PropertyGeneratedEventArgs eventArgs = new PropertyGeneratedEventArgs(Item, null, // no backing field typeRef); this.Generator.RaisePropertyGeneratedEvent(eventArgs); // [System.ComponentModel.Browsable(false)] // public TargetType TargetName // public EntityReferenceTargetName // or // public EntityCollection TargetNames CodeMemberProperty property = new CodeMemberProperty(); // Only reference navigation properties are currently currently supported with XML serialization // and thus we should use the XmlIgnore and SoapIgnore attributes on other property types. AttributeEmitter.AddIgnoreAttributes(property); AttributeEmitter.AddBrowsableAttribute(property); AttributeEmitter.AddGeneratedCodeAttribute(property); CommentEmitter.EmitSummaryComments(Item, property.Comments); property.Name = Item.Name; if (eventArgs.ReturnType != null && !eventArgs.ReturnType.Equals(typeRef)) { property.Type = eventArgs.ReturnType; } else { property.Type = typeRef; } property.Attributes = MemberAttributes.Final; CodeExpression getMethod = EmitGetMethod(target); CodeExpression getReturnExpression; if (target.RelationshipMultiplicity != RelationshipMultiplicity.Many) { property.Attributes |= AccessibilityFromGettersAndSetters(Item); // insert user-supplied Set code here, before the assignment // List additionalSetStatements = eventArgs.AdditionalSetStatements; if (additionalSetStatements != null && additionalSetStatements.Count > 0) { try { property.SetStatements.AddRange(additionalSetStatements.ToArray()); } catch (ArgumentNullException e) { Generator.AddError(Strings.InvalidSetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidSetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, e); } } CodeExpression valueRef = new CodePropertySetValueReferenceExpression(); if (typeRef != eventArgs.ReturnType) { // we need to cast to the actual type valueRef = new CodeCastExpression(typeRef, valueRef); } CodeExpression valueProperty = getMethod; // get // return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference ("CSpaceQualifiedRelationshipName", "TargetRoleName").Value; getReturnExpression = valueProperty; // set // ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference ("CSpaceQualifiedRelationshipName", "TargetRoleName").Value = value; property.SetStatements.Add( new CodeAssignStatement(valueProperty, valueRef)); // setup the accessibility of the navigation property setter and getter MemberAttributes propertyAccessibility = property.Attributes & MemberAttributes.AccessMask; PropertyEmitter.AddGetterSetterFixUp(Generator.FixUps, GetFullyQualifiedPropertyName(property.Name), PropertyEmitter.GetGetterAccessibility(Item), propertyAccessibility, true); PropertyEmitter.AddGetterSetterFixUp(Generator.FixUps, GetFullyQualifiedPropertyName(property.Name), PropertyEmitter.GetSetterAccessibility(Item), propertyAccessibility, false); List additionalAfterSetStatements = eventArgs.AdditionalAfterSetStatements; if (additionalAfterSetStatements != null && additionalAfterSetStatements.Count > 0) { try { property.SetStatements.AddRange(additionalAfterSetStatements.ToArray()); } catch (ArgumentNullException e) { Generator.AddError(Strings.InvalidSetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidSetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, e); } } } else { property.Attributes |= PropertyEmitter.GetGetterAccessibility(Item); // get // return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection ("CSpaceQualifiedRelationshipName", "TargetRoleName"); getReturnExpression = getMethod; // set // if (value != null) ==> Only for non-binding scenario // { // this = // this.OnPropertyChanged("") // } CodeExpression valueRef = new CodePropertySetValueReferenceExpression(); CodeStatementCollection csc = null; if (this.Generator.UseDataServiceCollection == true) { csc = property.SetStatements; } else { CodeConditionStatement ccs = new CodeConditionStatement(EmitExpressionDoesNotEqualNull(valueRef)); property.SetStatements.Add(ccs); csc = ccs.TrueStatements; } csc.Add(new CodeAssignStatement(getMethod, valueRef)); if (eventArgs.AdditionalAfterSetStatements != null) { try { foreach (CodeStatement s in eventArgs.AdditionalAfterSetStatements) { csc.Add(s); } } catch (ArgumentNullException e) { Generator.AddError(Strings.InvalidSetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidSetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, e); } } } // if additional Get statements were specified by the event subscriber, insert them now // List additionalGetStatements = eventArgs.AdditionalGetStatements; if (additionalGetStatements != null && additionalGetStatements.Count > 0) { try { property.GetStatements.AddRange(additionalGetStatements.ToArray()); } catch (ArgumentNullException ex) { Generator.AddError(Strings.InvalidGetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidGetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, ex); } } property.GetStatements.Add(new CodeMethodReturnStatement(getReturnExpression)); return property; } internal static bool IsNameAlreadyAMemberName(StructuralType type, string generatedPropertyName, StringComparison comparison) { foreach (EdmMember member in type.Members) { if (member.DeclaringType == type && member.Name.Equals(generatedPropertyName, comparison)) { return true; } } return false; } private string GetFullyQualifiedPropertyName(string propertyName) { return Item.DeclaringType.FullName + "." + propertyName; } /// /// Gives the SchemaElement back cast to the most /// appropriate type /// private new NavigationProperty Item { get { return base.Item as NavigationProperty; } } ////// Get the return type for the get method, given the target end /// /// /// true if the is the return type for a reference property ///the return type for a target private CodeTypeReference GetReturnType(RelationshipEndMember target) { CodeTypeReference returnType = Generator.GetLeastPossibleQualifiedTypeReference(GetEntityType(target)); if (target.RelationshipMultiplicity == RelationshipMultiplicity.Many) { returnType = TypeReference.FrameworkGenericClass(this.Generator.GetRelationshipMultiplicityManyCollectionTypeName(), returnType); } return returnType; } private static EntityTypeBase GetEntityType(RelationshipEndMember endMember) { Debug.Assert((BuiltInTypeKind.RefType == endMember.TypeUsage.EdmType.BuiltInTypeKind), "not a reference type"); EntityTypeBase type = ((RefType)endMember.TypeUsage.EdmType).ElementType; return type; } ////// Emit the GetRelatedCollection or GetRelatedReference methods /// /// Target end of the relationship ///Expression to invoke the appropriate method private CodeExpression EmitGetMethod(RelationshipEndMember target) { return new CodeFieldReferenceExpression(ThisRef, Utils.FieldNameFromPropName(Item.Name)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.CodeDom; using System.Collections.Generic; using System.Data.Metadata.Edm; using System.Data.Services.Design; using System.Diagnostics; namespace System.Data.EntityModel.Emitters { ////// Summary description for NavigationPropertyEmitter. /// internal sealed class NavigationPropertyEmitter : PropertyEmitterBase { private const string ValuePropertyName = "Value"; ////// /// /// /// public NavigationPropertyEmitter(ClientApiGenerator generator, NavigationProperty navigationProperty, bool declaringTypeUsesStandardBaseType) : base(generator, navigationProperty, declaringTypeUsesStandardBaseType) { } ////// Generate the navigation property /// /// The type to add the property to. protected override void EmitProperty(CodeTypeDeclaration typeDecl) { EmitNavigationProperty(typeDecl); } ////// Generate the navigation property specified /// /// The type to add the property to. private void EmitNavigationProperty(CodeTypeDeclaration typeDecl) { // create a regular property CodeMemberProperty property = EmitNavigationProperty(Item.ToEndMember); typeDecl.Members.Add(property); EmitField(typeDecl, GetReturnType(Item.ToEndMember), Item.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many); } private void EmitField(CodeTypeDeclaration typeDecl, CodeTypeReference fieldType, bool hasDefault) { CodeMemberField memberField = new CodeMemberField(fieldType, Utils.FieldNameFromPropName(Item.Name)); memberField.Attributes = MemberAttributes.Private; AttributeEmitter.AddGeneratedCodeAttribute(memberField); if (hasDefault) { if (this.Generator.UseDataServiceCollection) { // new DataServiceCollection(null, System.Data.Services.Client.TrackingMode.None, null, null, null); // declare type is DataServiceCollection Debug.Assert(fieldType.TypeArguments.Count == 1, "Declare type is non generic."); // new DataServiceCollection<[type]>(null, TrackingMode.None) memberField.InitExpression = new CodeObjectCreateExpression( fieldType, new CodePrimitiveExpression(null), new CodeFieldReferenceExpression( new CodeTypeReferenceExpression(typeof(System.Data.Services.Client.TrackingMode)), "None")); } else { memberField.InitExpression = new CodeObjectCreateExpression(fieldType); } } typeDecl.Members.Add(memberField); } /// /// Generate a navigation property /// /// the other end /// True to emit Reference navigation property ///the generated property private CodeMemberProperty EmitNavigationProperty(RelationshipEndMember target) { CodeTypeReference typeRef = GetReturnType(target); // raise the PropertyGenerated event PropertyGeneratedEventArgs eventArgs = new PropertyGeneratedEventArgs(Item, null, // no backing field typeRef); this.Generator.RaisePropertyGeneratedEvent(eventArgs); // [System.ComponentModel.Browsable(false)] // public TargetType TargetName // public EntityReferenceTargetName // or // public EntityCollection TargetNames CodeMemberProperty property = new CodeMemberProperty(); // Only reference navigation properties are currently currently supported with XML serialization // and thus we should use the XmlIgnore and SoapIgnore attributes on other property types. AttributeEmitter.AddIgnoreAttributes(property); AttributeEmitter.AddBrowsableAttribute(property); AttributeEmitter.AddGeneratedCodeAttribute(property); CommentEmitter.EmitSummaryComments(Item, property.Comments); property.Name = Item.Name; if (eventArgs.ReturnType != null && !eventArgs.ReturnType.Equals(typeRef)) { property.Type = eventArgs.ReturnType; } else { property.Type = typeRef; } property.Attributes = MemberAttributes.Final; CodeExpression getMethod = EmitGetMethod(target); CodeExpression getReturnExpression; if (target.RelationshipMultiplicity != RelationshipMultiplicity.Many) { property.Attributes |= AccessibilityFromGettersAndSetters(Item); // insert user-supplied Set code here, before the assignment // List additionalSetStatements = eventArgs.AdditionalSetStatements; if (additionalSetStatements != null && additionalSetStatements.Count > 0) { try { property.SetStatements.AddRange(additionalSetStatements.ToArray()); } catch (ArgumentNullException e) { Generator.AddError(Strings.InvalidSetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidSetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, e); } } CodeExpression valueRef = new CodePropertySetValueReferenceExpression(); if (typeRef != eventArgs.ReturnType) { // we need to cast to the actual type valueRef = new CodeCastExpression(typeRef, valueRef); } CodeExpression valueProperty = getMethod; // get // return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference ("CSpaceQualifiedRelationshipName", "TargetRoleName").Value; getReturnExpression = valueProperty; // set // ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference ("CSpaceQualifiedRelationshipName", "TargetRoleName").Value = value; property.SetStatements.Add( new CodeAssignStatement(valueProperty, valueRef)); // setup the accessibility of the navigation property setter and getter MemberAttributes propertyAccessibility = property.Attributes & MemberAttributes.AccessMask; PropertyEmitter.AddGetterSetterFixUp(Generator.FixUps, GetFullyQualifiedPropertyName(property.Name), PropertyEmitter.GetGetterAccessibility(Item), propertyAccessibility, true); PropertyEmitter.AddGetterSetterFixUp(Generator.FixUps, GetFullyQualifiedPropertyName(property.Name), PropertyEmitter.GetSetterAccessibility(Item), propertyAccessibility, false); List additionalAfterSetStatements = eventArgs.AdditionalAfterSetStatements; if (additionalAfterSetStatements != null && additionalAfterSetStatements.Count > 0) { try { property.SetStatements.AddRange(additionalAfterSetStatements.ToArray()); } catch (ArgumentNullException e) { Generator.AddError(Strings.InvalidSetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidSetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, e); } } } else { property.Attributes |= PropertyEmitter.GetGetterAccessibility(Item); // get // return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection ("CSpaceQualifiedRelationshipName", "TargetRoleName"); getReturnExpression = getMethod; // set // if (value != null) ==> Only for non-binding scenario // { // this = // this.OnPropertyChanged("") // } CodeExpression valueRef = new CodePropertySetValueReferenceExpression(); CodeStatementCollection csc = null; if (this.Generator.UseDataServiceCollection == true) { csc = property.SetStatements; } else { CodeConditionStatement ccs = new CodeConditionStatement(EmitExpressionDoesNotEqualNull(valueRef)); property.SetStatements.Add(ccs); csc = ccs.TrueStatements; } csc.Add(new CodeAssignStatement(getMethod, valueRef)); if (eventArgs.AdditionalAfterSetStatements != null) { try { foreach (CodeStatement s in eventArgs.AdditionalAfterSetStatements) { csc.Add(s); } } catch (ArgumentNullException e) { Generator.AddError(Strings.InvalidSetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidSetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, e); } } } // if additional Get statements were specified by the event subscriber, insert them now // List additionalGetStatements = eventArgs.AdditionalGetStatements; if (additionalGetStatements != null && additionalGetStatements.Count > 0) { try { property.GetStatements.AddRange(additionalGetStatements.ToArray()); } catch (ArgumentNullException ex) { Generator.AddError(Strings.InvalidGetStatementSuppliedForProperty(Item.Name), ModelBuilderErrorCode.InvalidGetStatementSuppliedForProperty, EdmSchemaErrorSeverity.Error, ex); } } property.GetStatements.Add(new CodeMethodReturnStatement(getReturnExpression)); return property; } internal static bool IsNameAlreadyAMemberName(StructuralType type, string generatedPropertyName, StringComparison comparison) { foreach (EdmMember member in type.Members) { if (member.DeclaringType == type && member.Name.Equals(generatedPropertyName, comparison)) { return true; } } return false; } private string GetFullyQualifiedPropertyName(string propertyName) { return Item.DeclaringType.FullName + "." + propertyName; } /// /// Gives the SchemaElement back cast to the most /// appropriate type /// private new NavigationProperty Item { get { return base.Item as NavigationProperty; } } ////// Get the return type for the get method, given the target end /// /// /// true if the is the return type for a reference property ///the return type for a target private CodeTypeReference GetReturnType(RelationshipEndMember target) { CodeTypeReference returnType = Generator.GetLeastPossibleQualifiedTypeReference(GetEntityType(target)); if (target.RelationshipMultiplicity == RelationshipMultiplicity.Many) { returnType = TypeReference.FrameworkGenericClass(this.Generator.GetRelationshipMultiplicityManyCollectionTypeName(), returnType); } return returnType; } private static EntityTypeBase GetEntityType(RelationshipEndMember endMember) { Debug.Assert((BuiltInTypeKind.RefType == endMember.TypeUsage.EdmType.BuiltInTypeKind), "not a reference type"); EntityTypeBase type = ((RefType)endMember.TypeUsage.EdmType).ElementType; return type; } ////// Emit the GetRelatedCollection or GetRelatedReference methods /// /// Target end of the relationship ///Expression to invoke the appropriate method private CodeExpression EmitGetMethod(RelationshipEndMember target) { return new CodeFieldReferenceExpression(ThisRef, Utils.FieldNameFromPropName(Item.Name)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DodSequenceMerge.cs
- RootBrowserWindow.cs
- TransactedReceiveData.cs
- CancelEventArgs.cs
- MultipleViewPattern.cs
- OdbcErrorCollection.cs
- BadImageFormatException.cs
- TreeViewAutomationPeer.cs
- DrawTreeNodeEventArgs.cs
- CreateUserWizardStep.cs
- RegexStringValidator.cs
- Config.cs
- WmpBitmapDecoder.cs
- FunctionUpdateCommand.cs
- _HeaderInfoTable.cs
- dsa.cs
- VirtualDirectoryMapping.cs
- InstanceHandle.cs
- QueryCreatedEventArgs.cs
- HierarchicalDataTemplate.cs
- HttpValueCollection.cs
- ThreadStaticAttribute.cs
- SkewTransform.cs
- BoundingRectTracker.cs
- ListenerSingletonConnectionReader.cs
- BamlRecordWriter.cs
- ProtocolViolationException.cs
- EdmMember.cs
- ConnectionStringsExpressionBuilder.cs
- DocumentApplication.cs
- RtfToXamlReader.cs
- WebPartDescription.cs
- PerformanceCounterManager.cs
- SqlCacheDependencyDatabaseCollection.cs
- VoiceObjectToken.cs
- ObjectStateEntry.cs
- FontEmbeddingManager.cs
- DataGridViewCellValueEventArgs.cs
- ConfigurationElementProperty.cs
- Variable.cs
- xml.cs
- CRYPTPROTECT_PROMPTSTRUCT.cs
- Rotation3DKeyFrameCollection.cs
- ProfilePropertyNameValidator.cs
- XNameConverter.cs
- DeviceContexts.cs
- OracleCommandSet.cs
- ApplicationFileParser.cs
- _DigestClient.cs
- initElementDictionary.cs
- ConfigurationFileMap.cs
- DoubleAnimationUsingPath.cs
- DataKeyCollection.cs
- CodeNamespaceCollection.cs
- RootProfilePropertySettingsCollection.cs
- XPathPatternBuilder.cs
- ResourceDictionary.cs
- ChannelAcceptor.cs
- DatePickerTextBox.cs
- CancelAsyncOperationRequest.cs
- COM2EnumConverter.cs
- Base64WriteStateInfo.cs
- Guid.cs
- FixedBufferAttribute.cs
- TextBox.cs
- ImageAttributes.cs
- ToolStripDropTargetManager.cs
- Expression.cs
- StorageEntitySetMapping.cs
- ConfigPathUtility.cs
- CultureInfoConverter.cs
- ContentPosition.cs
- MappingSource.cs
- Parsers.cs
- DataControlFieldHeaderCell.cs
- SessionEndedEventArgs.cs
- ZipFileInfo.cs
- BindingGroup.cs
- XslTransform.cs
- ForEachAction.cs
- PersonalizableTypeEntry.cs
- AlgoModule.cs
- Qualifier.cs
- AddInContractAttribute.cs
- MimeWriter.cs
- ChannelBinding.cs
- OleDbInfoMessageEvent.cs
- SecurityTokenSerializer.cs
- SessionIDManager.cs
- ResourceCategoryAttribute.cs
- ContainsSearchOperator.cs
- PackagePartCollection.cs
- SettingsPropertyValue.cs
- CodeAttachEventStatement.cs
- ComponentManagerBroker.cs
- ClientScriptManager.cs
- ObjectConverter.cs
- IPEndPoint.cs
- NotificationContext.cs
- DataGridColumn.cs