Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntityDesign / Design / System / Data / EntityModel / Emitters / AssociationTypeEmitter.cs / 1 / AssociationTypeEmitter.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.CodeDom;
using System.Data;
using System.Data.Metadata.Edm;
using System.Data.EntityModel.SchemaObjectModel;
using System.Diagnostics;
namespace System.Data.EntityModel.Emitters
{
///
/// Summary description for NestedTypeEmitter.
///
internal sealed class AssociationTypeEmitter : SchemaTypeEmitter
{
public AssociationTypeEmitter(ClientApiGenerator generator, AssociationType associationType)
: base(generator, associationType)
{
}
public override CodeTypeDeclarationCollection EmitApiClass()
{
Debug.Assert(Item.AssociationEndMembers.Count == 2, "must have exactly two ends");
AssociationEndMember end1 = Item.AssociationEndMembers[0];
AssociationEndMember end2 = Item.AssociationEndMembers[1];
Generator.CompileUnit.AssemblyCustomAttributes.Add(
AttributeEmitter.EmitSimpleAttribute(
Utils.FQAdoFrameworkDataClassesName("EdmRelationshipAttribute"),
Item.NamespaceName, //it is ok to use the c namespace because relationships aren't backed by clr objects
Item.Name,
end1.Name,
GetMultiplicityCodeExpression(end1.RelationshipMultiplicity),
GetEndTypeCodeExpression(end1),
end2.Name,
GetMultiplicityCodeExpression(end2.RelationshipMultiplicity),
GetEndTypeCodeExpression(end2)
));
// this method doesn't actually create a new type, just a new assembly level attribute for each end
return new CodeTypeDeclarationCollection();
}
private CodeTypeOfExpression GetEndTypeCodeExpression(AssociationEndMember end)
{
return new CodeTypeOfExpression(Generator.GetFullyQualifiedTypeReference(((RefType)end.TypeUsage.EdmType).ElementType));
}
private CodeExpression GetMultiplicityCodeExpression(RelationshipMultiplicity multiplicity)
{
// example:
// [System.Data.Objects.DataClasses.EdmRelationshipRoleAttribute("CustomerOrder", "Customer", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Customer))]
string roleMultiplicity = multiplicity.ToString();
CodeExpression roleMultiplicityExpression = Emitter.EmitEnumMemberExpression(
TypeReference.AdoFrameworkMetadataEdmType("RelationshipMultiplicity"), roleMultiplicity);
return roleMultiplicityExpression;
}
internal new AssociationType Item
{
get
{
return base.Item as AssociationType;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.CodeDom;
using System.Data;
using System.Data.Metadata.Edm;
using System.Data.EntityModel.SchemaObjectModel;
using System.Diagnostics;
namespace System.Data.EntityModel.Emitters
{
///
/// Summary description for NestedTypeEmitter.
///
internal sealed class AssociationTypeEmitter : SchemaTypeEmitter
{
public AssociationTypeEmitter(ClientApiGenerator generator, AssociationType associationType)
: base(generator, associationType)
{
}
public override CodeTypeDeclarationCollection EmitApiClass()
{
Debug.Assert(Item.AssociationEndMembers.Count == 2, "must have exactly two ends");
AssociationEndMember end1 = Item.AssociationEndMembers[0];
AssociationEndMember end2 = Item.AssociationEndMembers[1];
Generator.CompileUnit.AssemblyCustomAttributes.Add(
AttributeEmitter.EmitSimpleAttribute(
Utils.FQAdoFrameworkDataClassesName("EdmRelationshipAttribute"),
Item.NamespaceName, //it is ok to use the c namespace because relationships aren't backed by clr objects
Item.Name,
end1.Name,
GetMultiplicityCodeExpression(end1.RelationshipMultiplicity),
GetEndTypeCodeExpression(end1),
end2.Name,
GetMultiplicityCodeExpression(end2.RelationshipMultiplicity),
GetEndTypeCodeExpression(end2)
));
// this method doesn't actually create a new type, just a new assembly level attribute for each end
return new CodeTypeDeclarationCollection();
}
private CodeTypeOfExpression GetEndTypeCodeExpression(AssociationEndMember end)
{
return new CodeTypeOfExpression(Generator.GetFullyQualifiedTypeReference(((RefType)end.TypeUsage.EdmType).ElementType));
}
private CodeExpression GetMultiplicityCodeExpression(RelationshipMultiplicity multiplicity)
{
// example:
// [System.Data.Objects.DataClasses.EdmRelationshipRoleAttribute("CustomerOrder", "Customer", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Customer))]
string roleMultiplicity = multiplicity.ToString();
CodeExpression roleMultiplicityExpression = Emitter.EmitEnumMemberExpression(
TypeReference.AdoFrameworkMetadataEdmType("RelationshipMultiplicity"), roleMultiplicity);
return roleMultiplicityExpression;
}
internal new AssociationType Item
{
get
{
return base.Item as AssociationType;
}
}
}
}
// 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
- PreviewPageInfo.cs
- UriExt.cs
- FontStretchConverter.cs
- StringAnimationBase.cs
- JumpPath.cs
- HttpCachePolicyWrapper.cs
- OptimizerPatterns.cs
- ControlBindingsConverter.cs
- OrderByBuilder.cs
- Assembly.cs
- EventLogPermission.cs
- DataGridViewColumnHeaderCell.cs
- DoubleAnimation.cs
- RegistrationProxy.cs
- DropShadowEffect.cs
- RijndaelCryptoServiceProvider.cs
- NavigationEventArgs.cs
- Transform3DGroup.cs
- DotExpr.cs
- DocComment.cs
- StructuredCompositeActivityDesigner.cs
- RelatedCurrencyManager.cs
- XamlFigureLengthSerializer.cs
- TextBoxBase.cs
- AssemblyResolver.cs
- BigInt.cs
- StretchValidation.cs
- VectorAnimation.cs
- Margins.cs
- GroupStyle.cs
- CryptoConfig.cs
- SqlProviderServices.cs
- FileChangesMonitor.cs
- ObjectNavigationPropertyMapping.cs
- VectorCollectionValueSerializer.cs
- AnalyzedTree.cs
- TypeElement.cs
- UnaryOperationBinder.cs
- SymbolResolver.cs
- FixedFlowMap.cs
- RotateTransform3D.cs
- Encoding.cs
- CapabilitiesRule.cs
- EmptyTextWriter.cs
- DCSafeHandle.cs
- DataServiceExpressionVisitor.cs
- ValidationResult.cs
- CounterCreationData.cs
- HttpModulesSection.cs
- IntegerFacetDescriptionElement.cs
- RelatedPropertyManager.cs
- XmlSchemaAnyAttribute.cs
- MessageDirection.cs
- returneventsaver.cs
- XmlSchemaCompilationSettings.cs
- EntityClassGenerator.cs
- TextDecoration.cs
- XmlImplementation.cs
- RoleManagerSection.cs
- XmlArrayItemAttributes.cs
- TransformerInfo.cs
- PingReply.cs
- StandardBindingReliableSessionElement.cs
- PeerEndPoint.cs
- ContextMenuService.cs
- IndentedWriter.cs
- RegexCompiler.cs
- MultiByteCodec.cs
- Attribute.cs
- PrintEvent.cs
- ConfigurationErrorsException.cs
- ConfigXmlText.cs
- TraceSource.cs
- UInt16Converter.cs
- PageCache.cs
- PropVariant.cs
- DesignBindingEditor.cs
- PropertyEmitterBase.cs
- TraceHandlerErrorFormatter.cs
- JulianCalendar.cs
- XmlDictionary.cs
- SchemaImporterExtension.cs
- BinHexDecoder.cs
- MessageBox.cs
- ScriptBehaviorDescriptor.cs
- ScrollBar.cs
- Figure.cs
- MaskedTextBoxDesignerActionList.cs
- SqlBuffer.cs
- RtfControls.cs
- SemaphoreSecurity.cs
- CapabilitiesRule.cs
- SmtpTransport.cs
- SqlUtils.cs
- PtsHost.cs
- Encoder.cs
- ListItem.cs
- UriScheme.cs
- RadioButtonAutomationPeer.cs
- EmptyEnumerable.cs