//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Data.Metadata.Edm;
using System.Diagnostics;
namespace System.Data.Mapping {
///
/// Represents the Mapping metadata for an EnitytSet in CS space.
///
///
/// For Example if conceptually you could represent the CS MSL file as following
/// --Mapping
/// --EntityContainerMapping ( CNorthwind-->SNorthwind )
/// --EntitySetMapping
/// --EntityTypeMapping
/// --MappingFragment
/// --EntityTypeMapping
/// --MappingFragment
/// --AssociationSetMapping
/// --AssociationTypeMapping
/// --MappingFragment
/// This class represents the metadata for the EntitySetMapping elements in the
/// above example. And it is possible to access the EntityTypeMaps underneath it.
///
internal class StorageEntitySetMapping : StorageSetMapping {
#region Constructors
///
/// Construct a EntitySet mapping object
///
/// EntitySet metadata object
/// The entity Container Mapping that contains this Set mapping
internal StorageEntitySetMapping(EntitySet extent, StorageEntityContainerMapping entityContainerMapping)
: base(extent, entityContainerMapping) {
m_modificationFunctionMappings = new List();
m_implicitlyMappedAssociationSetEnds = new List();
}
#endregion
#region Fields
private readonly List m_modificationFunctionMappings;
private readonly List m_implicitlyMappedAssociationSetEnds;
#endregion
#region Properties
///
/// Gets all function mappings for this entity set.
///
internal IList ModificationFunctionMappings {
get { return m_modificationFunctionMappings.AsReadOnly(); }
}
///
/// Gets all association sets that are implicitly "covered" through function mappings.
///
internal IList ImplicitlyMappedAssociationSetEnds {
get { return m_implicitlyMappedAssociationSetEnds.AsReadOnly(); }
}
///
/// Whether the EntitySetMapping has empty content
/// Returns true if there are no Function Maps and no table Mapping fragments
///
internal override bool HasNoContent {
get {
if (m_modificationFunctionMappings.Count != 0) {
return false;
}
return base.HasNoContent;
}
}
#endregion
#region Methods
///
/// This method is primarily for debugging purposes.
/// Will be removed shortly.
///
internal override void Print(int index) {
StorageEntityContainerMapping.GetPrettyPrintString(ref index);
StringBuilder sb = new StringBuilder();
sb.Append("EntitySetMapping");
sb.Append(" ");
sb.Append("Name:");
sb.Append(this.Set.Name);
if (this.QueryView != null)
{
sb.Append(" ");
sb.Append("Query View:");
sb.Append(this.QueryView);
}
Console.WriteLine(sb.ToString());
foreach (StorageTypeMapping typeMapping in TypeMappings) {
typeMapping.Print(index+5);
}
foreach (StorageEntityTypeModificationFunctionMapping m in m_modificationFunctionMappings)
{
m.Print(index + 10);
}
}
///
/// Requires:
/// - Function mapping refers to a sub-type of this entity set's element type
/// - Function mappings for types are not redundantly specified
/// Adds a new function mapping for this class.
///
/// Function mapping to add. May not be null.
internal void AddModificationFunctionMapping(StorageEntityTypeModificationFunctionMapping modificationFunctionMapping) {
AssertModificationFunctionMappingInvariants(modificationFunctionMapping);
m_modificationFunctionMappings.Add(modificationFunctionMapping);
// check if any association sets are indirectly mapped within this function mapping
// through association navigation bindings
if (null != modificationFunctionMapping.DeleteFunctionMapping)
{
m_implicitlyMappedAssociationSetEnds.AddRange(modificationFunctionMapping.DeleteFunctionMapping.CollocatedAssociationSetEnds);
}
if (null != modificationFunctionMapping.InsertFunctionMapping)
{
m_implicitlyMappedAssociationSetEnds.AddRange(modificationFunctionMapping.InsertFunctionMapping.CollocatedAssociationSetEnds);
}
if (null != modificationFunctionMapping.UpdateFunctionMapping)
{
m_implicitlyMappedAssociationSetEnds.AddRange(modificationFunctionMapping.UpdateFunctionMapping.CollocatedAssociationSetEnds);
}
}
[Conditional("DEBUG")]
internal void AssertModificationFunctionMappingInvariants(StorageEntityTypeModificationFunctionMapping modificationFunctionMapping) {
Debug.Assert(null != modificationFunctionMapping, "modification function mapping must not be null");
Debug.Assert(modificationFunctionMapping.EntityType.Equals(this.Set.ElementType) ||
Helper.IsSubtypeOf(modificationFunctionMapping.EntityType, this.Set.ElementType),
"attempting to add a modification function mapping with the wrong entity type");
foreach (StorageEntityTypeModificationFunctionMapping existingMapping in m_modificationFunctionMappings) {
Debug.Assert(!existingMapping.EntityType.Equals(modificationFunctionMapping.EntityType),
"modification function mapping already exists for this type");
}
}
#endregion
}
}