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
- TrayIconDesigner.cs
- TimeSpanMinutesOrInfiniteConverter.cs
- AccessControlList.cs
- MemberAssignmentAnalysis.cs
- KeyPressEvent.cs
- GridEntryCollection.cs
- NonParentingControl.cs
- XmlILOptimizerVisitor.cs
- StylusPoint.cs
- CultureData.cs
- Paragraph.cs
- _LocalDataStore.cs
- ReadOnlyHierarchicalDataSource.cs
- InstanceDataCollectionCollection.cs
- StateBag.cs
- RegexParser.cs
- _ListenerRequestStream.cs
- MemoryFailPoint.cs
- XmlRawWriter.cs
- ProfilePropertyNameValidator.cs
- QueryExpr.cs
- EdmComplexTypeAttribute.cs
- EntityDataSourceViewSchema.cs
- Vector3DConverter.cs
- KeyValuePairs.cs
- D3DImage.cs
- RelationshipEndMember.cs
- ValueChangedEventManager.cs
- Link.cs
- BatchStream.cs
- RuleSetReference.cs
- NumberFormatInfo.cs
- ProviderBase.cs
- PolyBezierSegmentFigureLogic.cs
- PreservationFileReader.cs
- SystemColorTracker.cs
- StdValidatorsAndConverters.cs
- COM2PropertyDescriptor.cs
- SchemaImporter.cs
- SolidBrush.cs
- RandomNumberGenerator.cs
- SymLanguageVendor.cs
- WebControlParameterProxy.cs
- ThreadExceptionEvent.cs
- LicenseManager.cs
- DetailsView.cs
- ReturnValue.cs
- HttpCookieCollection.cs
- TextParaLineResult.cs
- Literal.cs
- SettingsSection.cs
- CookieParameter.cs
- ReflectionHelper.cs
- XamlHostingConfiguration.cs
- Focus.cs
- AssemblyResolver.cs
- HtmlInputReset.cs
- HelpKeywordAttribute.cs
- XmlSchemaFacet.cs
- PenThread.cs
- SystemUdpStatistics.cs
- DataControlFieldHeaderCell.cs
- CompensationTokenData.cs
- BaseAddressElement.cs
- mansign.cs
- EtwTrace.cs
- IsolatedStorage.cs
- ReadOnlyDataSource.cs
- TextOnlyOutput.cs
- EventQueueState.cs
- TextEditor.cs
- WebPartTracker.cs
- Privilege.cs
- UiaCoreTypesApi.cs
- NamedPermissionSet.cs
- SqlSelectStatement.cs
- RandomNumberGenerator.cs
- ImpersonationContext.cs
- cookieexception.cs
- SoapFault.cs
- KeyedByTypeCollection.cs
- Rfc2898DeriveBytes.cs
- PEFileEvidenceFactory.cs
- StylusPointPropertyUnit.cs
- TextProviderWrapper.cs
- KeyValuePairs.cs
- MarkupCompilePass1.cs
- Run.cs
- ProvideValueServiceProvider.cs
- DiscoveryDocumentSerializer.cs
- ErrorHandlingAcceptor.cs
- RectConverter.cs
- StylusLogic.cs
- Style.cs
- VarRemapper.cs
- NullableBoolConverter.cs
- Point4DConverter.cs
- ReachBasicContext.cs
- CodeCommentStatementCollection.cs
- WebRequestModulesSection.cs