1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
|
//---------------------------------------------------------------------
// <copyright file="EntitySetBase.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//
// @owner Microsoft
// @backupOwner Microsoft
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Diagnostics;
using System.Text;
namespace System.Data.Metadata.Edm
{
/// <summary>
/// Class for representing a entity set
/// </summary>
public abstract class EntitySetBase : MetadataItem
{
//----------------------------------------------------------------------------------------------
// Possible Future Enhancement: revisit factoring of EntitySetBase and delta between C constructs and S constructs
//
// Currently, we need to have a way to map an entityset or a relationship set in S space
// to the appropriate structures in the store. In order to address this we said we would
// add new ItemAttributes (tableName, schemaName and catalogName to the EntitySetBase)...
// problem with this is that we are bleading a leaf-level, store specific set of constructs
// into the object model for things that may exist at either C or S.
//
// We need to do this for now to push forward on enabling the conversion but we need to re-examine
// whether we should have separate C and S space constructs or some other mechanism for
// maintaining this metadata.
//----------------------------------------------------------------------------------------------
#region Constructors
/// <summary>
/// The constructor for constructing the EntitySet with a given name and an entity type
/// </summary>
/// <param name="name">The name of the EntitySet</param>
/// <param name="schema">The db schema</param>
/// <param name="table">The db table</param>
/// <param name="definingQuery">The provider specific query that should be used to retrieve the EntitySet</param>
/// <param name="entityType">The entity type of the entities that this entity set type contains</param>
/// <exception cref="System.ArgumentNullException">Thrown if the name or entityType argument is null</exception>
internal EntitySetBase(string name, string schema, string table, string definingQuery, EntityTypeBase entityType)
{
EntityUtil.GenericCheckArgumentNull(entityType, "entityType");
EntityUtil.CheckStringArgument(name, "name");
// SQLBU 480236: catalogName, schemaName & tableName are allowed to be null, empty & non-empty
_name = name;
//---- name of the 'schema'
//---- this is used by the SQL Gen utility to support generation of the correct name in the store
_schema = schema;
//---- name of the 'table'
//---- this is used by the SQL Gen utility to support generation of the correct name in the store
_table = table;
//---- the Provider specific query to use to retrieve the EntitySet data
_definingQuery = definingQuery;
this.ElementType = entityType;
}
#endregion
#region Fields
private EntityContainer _entityContainer;
private string _name;
private EntityTypeBase _elementType;
private string _table;
private string _schema;
private string _definingQuery;
private string _cachedProviderSql;
#endregion
#region Properties
/// <summary>
/// Returns the kind of the type
/// </summary>
public override BuiltInTypeKind BuiltInTypeKind { get { return BuiltInTypeKind.EntitySetBase; } }
/// <summary>
/// Gets the identity for this item as a string
/// </summary>
internal override string Identity
{
get
{
return this.Name;
}
}
/// <summary>
/// Gets or sets escaped SQL describing this entity set.
/// </summary>
[MetadataProperty(PrimitiveTypeKind.String, false)]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] // referenced by System.Data.Entity.Design.dll
internal string DefiningQuery
{
get { return _definingQuery; }
set { _definingQuery = value; }
}
/// <summary>
/// Get and set by the provider only as a convientent place to
/// store the created sql fragment that represetnts this entity set
/// </summary>
internal string CachedProviderSql
{
get { return _cachedProviderSql; }
set { _cachedProviderSql = value; }
}
/// <summary>
/// Gets/Sets the name of this entity set
/// </summary>
/// <exception cref="System.ArgumentNullException">Thrown if value passed into setter is null</exception>
/// <exception cref="System.InvalidOperationException">Thrown if the setter is called when EntitySetBase instance is in ReadOnly state</exception>
[MetadataProperty(PrimitiveTypeKind.String, false)]
public String Name
{
get
{
return _name;
}
}
/// <summary>
/// Returns the entity container of the entity set
/// </summary>
/// <exception cref="System.ArgumentNullException">Thrown if value passed into setter is null</exception>
/// <exception cref="System.InvalidOperationException">Thrown if the setter is called when the EntitySetBase instance or the EntityContainer passed into the setter is in ReadOnly state</exception>
public EntityContainer EntityContainer
{
get
{
return _entityContainer;
}
}
/// <summary>
/// Gets/Sets the entity type of this entity set
/// </summary>
/// <exception cref="System.ArgumentNullException">if value passed into setter is null</exception>
/// <exception cref="System.InvalidOperationException">Thrown if the setter is called when EntitySetBase instance is in ReadOnly state</exception>
[MetadataProperty(BuiltInTypeKind.EntityTypeBase, false)]
public EntityTypeBase ElementType
{
get
{
return _elementType;
}
internal set
{
EntityUtil.GenericCheckArgumentNull(value, "value");
Util.ThrowIfReadOnly(this);
_elementType = value;
}
}
[MetadataProperty(PrimitiveTypeKind.String, false)]
internal string Table
{
get
{
return _table;
}
}
[MetadataProperty(PrimitiveTypeKind.String, false)]
internal string Schema
{
get
{
return _schema;
}
}
#endregion
#region Methods
/// <summary>
/// Overriding System.Object.ToString to provide better String representation
/// for this type.
/// </summary>
public override string ToString()
{
return Name;
}
/// <summary>
/// Sets this item to be readonly, once this is set, the item will never be writable again.
/// </summary>
internal override void SetReadOnly()
{
if (!this.IsReadOnly)
{
base.SetReadOnly();
EntityTypeBase elementType = ElementType;
if (elementType != null)
{
elementType.SetReadOnly();
}
}
}
/// <summary>
/// Change the entity container without doing fixup in the entity set collection
/// </summary>
internal void ChangeEntityContainerWithoutCollectionFixup(EntityContainer newEntityContainer)
{
_entityContainer = newEntityContainer;
}
#endregion
}
}
|