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
- PrimarySelectionAdorner.cs
- InvalidFilterCriteriaException.cs
- Transactions.cs
- WeakEventTable.cs
- KeyNotFoundException.cs
- DesignerCommandSet.cs
- SpnegoTokenProvider.cs
- EdmTypeAttribute.cs
- SafeNativeMethods.cs
- ListBox.cs
- RecognizeCompletedEventArgs.cs
- BooleanKeyFrameCollection.cs
- rsa.cs
- AppSettingsSection.cs
- EventLogReader.cs
- _ConnectionGroup.cs
- ObjectIDGenerator.cs
- SqlWebEventProvider.cs
- InternalDuplexBindingElement.cs
- DelegatingConfigHost.cs
- DrawListViewSubItemEventArgs.cs
- HttpWebRequest.cs
- MaskInputRejectedEventArgs.cs
- XmlSchemaExternal.cs
- InstanceStore.cs
- ISessionStateStore.cs
- LogPolicy.cs
- remotingproxy.cs
- WebPartDescription.cs
- CodeEntryPointMethod.cs
- DataGridViewAddColumnDialog.cs
- TextBox.cs
- GeneralTransformGroup.cs
- SHA384CryptoServiceProvider.cs
- EditorZoneBase.cs
- SerializationException.cs
- CaseCqlBlock.cs
- ExpandableObjectConverter.cs
- CalendarModeChangedEventArgs.cs
- xdrvalidator.cs
- DocumentPageTextView.cs
- InkCanvasAutomationPeer.cs
- Expression.cs
- DataReaderContainer.cs
- PointLight.cs
- ServiceMemoryGates.cs
- DocumentXmlWriter.cs
- AccessText.cs
- WindowsTreeView.cs
- StreamAsIStream.cs
- PropertyKey.cs
- BufferedReadStream.cs
- WebPartTransformerCollection.cs
- SingleSelectRootGridEntry.cs
- GradientBrush.cs
- ControlPager.cs
- Msec.cs
- COM2TypeInfoProcessor.cs
- SourceLineInfo.cs
- DataGridColumnCollectionEditor.cs
- ServiceObjectContainer.cs
- ObjectQueryProvider.cs
- TypeDescriptionProvider.cs
- PlatformCulture.cs
- ArraySubsetEnumerator.cs
- MouseGestureConverter.cs
- BorderGapMaskConverter.cs
- UIElementParaClient.cs
- SqlDesignerDataSourceView.cs
- CommandSet.cs
- HtmlLiteralTextAdapter.cs
- TransformedBitmap.cs
- DesignSurface.cs
- DebugInfo.cs
- SQLDecimal.cs
- IconConverter.cs
- TwoPhaseCommit.cs
- ConfigDefinitionUpdates.cs
- BulletedList.cs
- Compiler.cs
- HandleCollector.cs
- HierarchicalDataBoundControl.cs
- SafeRegistryHandle.cs
- PathNode.cs
- OpacityConverter.cs
- WebPartTransformerCollection.cs
- XPathDocumentIterator.cs
- ConsoleCancelEventArgs.cs
- ScrollEvent.cs
- _Events.cs
- ToolStripPanel.cs
- KeyValueConfigurationElement.cs
- RegexRunnerFactory.cs
- DecimalStorage.cs
- TypeConverterAttribute.cs
- DocumentXmlWriter.cs
- RTTypeWrapper.cs
- Version.cs
- ReachSerializableProperties.cs
- HostedImpersonationContext.cs