EntityContainerAssociationSet.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / EntityModel / SchemaObjectModel / EntityContainerAssociationSet.cs / 3 / EntityContainerAssociationSet.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

using System; 
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics; 
using System.Xml;
using System.Data; 
using System.Data.Objects.DataClasses; 
using System.Data.Metadata.Edm;
 
namespace System.Data.EntityModel.SchemaObjectModel
{
    /// 
    /// Represents an AssociationSet element. 
    /// 
    internal sealed class EntityContainerAssociationSet : EntityContainerRelationshipSet 
    { 
        // Note: If you add more fields, please make sure you handle that in the clone method
        private Dictionary _relationshipEnds = new Dictionary(); 
        private List _rolelessEnds = new List();

        /// 
        /// Constructs an EntityContainerAssociationSet 
        /// 
        /// Reference to the schema element. 
        public EntityContainerAssociationSet( EntityContainer parentElement ) 
            : base( parentElement )
        { 
        }


        ///  
        /// The ends defined and infered for this AssociationSet
        ///  
        internal override IEnumerable Ends 
        {
            get 
            {
                foreach ( EntityContainerAssociationSetEnd end in _relationshipEnds.Values )
                {
                    yield return end; 
                }
 
                foreach ( EntityContainerAssociationSetEnd end in _rolelessEnds ) 
                {
                    yield return end; 
                }
            }
        }
 
        protected override bool HandleAttribute(XmlReader reader)
        { 
            if (base.HandleAttribute(reader)) 
            {
                return true; 
            }
            else if (CanHandleAttribute(reader, XmlConstants.Association))
            {
                HandleRelationshipTypeNameAttribute(reader); 
                return true;
            } 
 
            return false;
        } 

        protected override bool HandleElement(XmlReader reader)
        {
            if (base.HandleElement(reader)) 
            {
                return true; 
            } 
            else if (CanHandleElement(reader, XmlConstants.End))
            { 
                HandleEndElement(reader);
                return true;
            }
            return false; 
        }
 
        ///  
        /// The method that is called when an End element is encountered.
        ///  
        /// The XmlReader positioned at the EndElement.
        private void HandleEndElement( XmlReader reader )
        {
            Debug.Assert( reader != null ); 

            EntityContainerAssociationSetEnd end = new EntityContainerAssociationSetEnd( this ); 
            end.Parse( reader ); 

            if ( end.Role == null  ) 
            {
                // we will resolve the role name later and put it in the
                // normal _relationshipEnds dictionary
                _rolelessEnds.Add( end ); 
                return;
            } 
 
            if ( HasEnd( end.Role ) )
            { 
                end.AddError( ErrorCode.InvalidName, EdmSchemaErrorSeverity.Error, reader,
                    System.Data.Entity.Strings.DuplicateEndName(end.Name ) );
                return;
            } 

            _relationshipEnds.Add( end.Role, end ); 
        } 

        internal override void ResolveTopLevelNames() 
        {
            base.ResolveTopLevelNames();

            // this just got resolved 
            if ( Relationship != null &&
                 Relationship.RelationshipKind != RelationshipKind.Association ) 
            { 
                AddError( ErrorCode.BadType,
                   EdmSchemaErrorSeverity.Error, 
                   System.Data.Entity.Strings.AssociationSetInvalidRelationshipKind(FQName ) );
            }
        }
 
        internal override void ResolveSecondLevelNames()
        { 
            base.ResolveSecondLevelNames(); 
            // the base class should have fixed up the role names on my ends
            foreach (EntityContainerAssociationSetEnd end in _rolelessEnds) 
            {
                if (end.Role != null)
                {
                    if (HasEnd(end.Role)) 
                    {
                        end.AddError(ErrorCode.InvalidName, EdmSchemaErrorSeverity.Error, 
                            System.Data.Entity.Strings.InferRelationshipEndGivesAlreadyDefinedEnd(end.EntitySet.FQName, Name)); 
                    }
                    else 
                    {
                        _relationshipEnds.Add(end.Role, end);
                    }
                } 

                // any that didn't get resolved will already have errors entered 
            } 

            _rolelessEnds.Clear(); 
        }

        /// 
        /// Create and add a EntityContainerEnd from the IRelationshipEnd provided 
        /// 
        /// The relationship end of the end to add. 
        /// The entitySet to associate with the relationship end. 
        protected override void AddEnd( IRelationshipEnd relationshipEnd, EntityContainerEntitySet entitySet )
        { 
            Debug.Assert( relationshipEnd != null );
            Debug.Assert( !_relationshipEnds.ContainsKey( relationshipEnd.Name ) );
            // we expect set to be null sometimes
 
            EntityContainerAssociationSetEnd end = new EntityContainerAssociationSetEnd( this );
            end.Role = relationshipEnd.Name; 
            end.RelationshipEnd = relationshipEnd; 

            end.EntitySet = entitySet; 
            if ( end.EntitySet != null )
            {
                _relationshipEnds.Add( end.Role, end );
            } 
        }
 
        protected override bool HasEnd( string role ) 
        {
            return _relationshipEnds.ContainsKey( role ); 
        }

        internal override SchemaElement Clone(SchemaElement parentElement)
        { 
            EntityContainerAssociationSet associationSet = new EntityContainerAssociationSet((EntityContainer)parentElement);
 
            associationSet.Name = this.Name; 
            associationSet.Relationship = this.Relationship;
 
            foreach (EntityContainerAssociationSetEnd end in this.Ends)
            {
                EntityContainerAssociationSetEnd clonedEnd = (EntityContainerAssociationSetEnd)end.Clone(associationSet);
                associationSet._relationshipEnds.Add(clonedEnd.Role, clonedEnd); 
            }
 
            return associationSet; 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

using System; 
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics; 
using System.Xml;
using System.Data; 
using System.Data.Objects.DataClasses; 
using System.Data.Metadata.Edm;
 
namespace System.Data.EntityModel.SchemaObjectModel
{
    /// 
    /// Represents an AssociationSet element. 
    /// 
    internal sealed class EntityContainerAssociationSet : EntityContainerRelationshipSet 
    { 
        // Note: If you add more fields, please make sure you handle that in the clone method
        private Dictionary _relationshipEnds = new Dictionary(); 
        private List _rolelessEnds = new List();

        /// 
        /// Constructs an EntityContainerAssociationSet 
        /// 
        /// Reference to the schema element. 
        public EntityContainerAssociationSet( EntityContainer parentElement ) 
            : base( parentElement )
        { 
        }


        ///  
        /// The ends defined and infered for this AssociationSet
        ///  
        internal override IEnumerable Ends 
        {
            get 
            {
                foreach ( EntityContainerAssociationSetEnd end in _relationshipEnds.Values )
                {
                    yield return end; 
                }
 
                foreach ( EntityContainerAssociationSetEnd end in _rolelessEnds ) 
                {
                    yield return end; 
                }
            }
        }
 
        protected override bool HandleAttribute(XmlReader reader)
        { 
            if (base.HandleAttribute(reader)) 
            {
                return true; 
            }
            else if (CanHandleAttribute(reader, XmlConstants.Association))
            {
                HandleRelationshipTypeNameAttribute(reader); 
                return true;
            } 
 
            return false;
        } 

        protected override bool HandleElement(XmlReader reader)
        {
            if (base.HandleElement(reader)) 
            {
                return true; 
            } 
            else if (CanHandleElement(reader, XmlConstants.End))
            { 
                HandleEndElement(reader);
                return true;
            }
            return false; 
        }
 
        ///  
        /// The method that is called when an End element is encountered.
        ///  
        /// The XmlReader positioned at the EndElement.
        private void HandleEndElement( XmlReader reader )
        {
            Debug.Assert( reader != null ); 

            EntityContainerAssociationSetEnd end = new EntityContainerAssociationSetEnd( this ); 
            end.Parse( reader ); 

            if ( end.Role == null  ) 
            {
                // we will resolve the role name later and put it in the
                // normal _relationshipEnds dictionary
                _rolelessEnds.Add( end ); 
                return;
            } 
 
            if ( HasEnd( end.Role ) )
            { 
                end.AddError( ErrorCode.InvalidName, EdmSchemaErrorSeverity.Error, reader,
                    System.Data.Entity.Strings.DuplicateEndName(end.Name ) );
                return;
            } 

            _relationshipEnds.Add( end.Role, end ); 
        } 

        internal override void ResolveTopLevelNames() 
        {
            base.ResolveTopLevelNames();

            // this just got resolved 
            if ( Relationship != null &&
                 Relationship.RelationshipKind != RelationshipKind.Association ) 
            { 
                AddError( ErrorCode.BadType,
                   EdmSchemaErrorSeverity.Error, 
                   System.Data.Entity.Strings.AssociationSetInvalidRelationshipKind(FQName ) );
            }
        }
 
        internal override void ResolveSecondLevelNames()
        { 
            base.ResolveSecondLevelNames(); 
            // the base class should have fixed up the role names on my ends
            foreach (EntityContainerAssociationSetEnd end in _rolelessEnds) 
            {
                if (end.Role != null)
                {
                    if (HasEnd(end.Role)) 
                    {
                        end.AddError(ErrorCode.InvalidName, EdmSchemaErrorSeverity.Error, 
                            System.Data.Entity.Strings.InferRelationshipEndGivesAlreadyDefinedEnd(end.EntitySet.FQName, Name)); 
                    }
                    else 
                    {
                        _relationshipEnds.Add(end.Role, end);
                    }
                } 

                // any that didn't get resolved will already have errors entered 
            } 

            _rolelessEnds.Clear(); 
        }

        /// 
        /// Create and add a EntityContainerEnd from the IRelationshipEnd provided 
        /// 
        /// The relationship end of the end to add. 
        /// The entitySet to associate with the relationship end. 
        protected override void AddEnd( IRelationshipEnd relationshipEnd, EntityContainerEntitySet entitySet )
        { 
            Debug.Assert( relationshipEnd != null );
            Debug.Assert( !_relationshipEnds.ContainsKey( relationshipEnd.Name ) );
            // we expect set to be null sometimes
 
            EntityContainerAssociationSetEnd end = new EntityContainerAssociationSetEnd( this );
            end.Role = relationshipEnd.Name; 
            end.RelationshipEnd = relationshipEnd; 

            end.EntitySet = entitySet; 
            if ( end.EntitySet != null )
            {
                _relationshipEnds.Add( end.Role, end );
            } 
        }
 
        protected override bool HasEnd( string role ) 
        {
            return _relationshipEnds.ContainsKey( role ); 
        }

        internal override SchemaElement Clone(SchemaElement parentElement)
        { 
            EntityContainerAssociationSet associationSet = new EntityContainerAssociationSet((EntityContainer)parentElement);
 
            associationSet.Name = this.Name; 
            associationSet.Relationship = this.Relationship;
 
            foreach (EntityContainerAssociationSetEnd end in this.Ends)
            {
                EntityContainerAssociationSetEnd clonedEnd = (EntityContainerAssociationSetEnd)end.Clone(associationSet);
                associationSet._relationshipEnds.Add(clonedEnd.Role, clonedEnd); 
            }
 
            return associationSet; 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK