Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / DbmlShared / Mapping.cs / 1305376 / Mapping.cs
using System; using System.Collections.Generic; using System.Data; using System.Data.Linq; using System.Data.Linq.Mapping; using System.Globalization; namespace LinqToSqlShared.Mapping { ////// DatabaseMapping and related classes represent a parsed version of the /// XML mapping string. This unvalidated intermediate representation is /// necessary because unused mappings are intentially never validated. /// internal class DatabaseMapping { string databaseName; string provider; Listtables; List functions; internal DatabaseMapping() { this.tables = new List (); this.functions = new List (); } internal string DatabaseName { get { return this.databaseName; } set { this.databaseName = value; } } internal string Provider { get { return this.provider; } set { this.provider = value; } } internal List Tables { get { return this.tables; } } internal List Functions { get { return this.functions; } } internal TableMapping GetTable(string tableName) { foreach (TableMapping tmap in this.tables) { if (string.Compare(tmap.TableName, tableName, StringComparison.Ordinal) == 0) return tmap; } return null; } internal TableMapping GetTable(Type rowType) { foreach (TableMapping tableMap in this.tables) { if (this.IsType(tableMap.RowType, rowType)) { return tableMap; } } return null; } private bool IsType(TypeMapping map, Type type) { if (string.Compare(map.Name, type.Name, StringComparison.Ordinal) == 0 || string.Compare(map.Name, type.FullName, StringComparison.Ordinal) == 0 || string.Compare(map.Name, type.AssemblyQualifiedName, StringComparison.Ordinal) == 0) return true; foreach (TypeMapping subMap in map.DerivedTypes) { if (this.IsType(subMap, type)) return true; } return false; } internal FunctionMapping GetFunction(string functionName) { foreach (FunctionMapping fmap in this.functions) { if (string.Compare(fmap.Name, functionName, StringComparison.Ordinal) == 0) return fmap; } return null; } } /// /// Constants in the mapping schema. /// class XmlMappingConstant { internal const string Association = "Association"; internal const string AutoSync = "AutoSync"; internal const string Column = "Column"; internal const string Database = "Database"; internal const string DbType = "DbType"; internal const string DeleteRule = "DeleteRule"; internal const string DeleteOnNull = "DeleteOnNull"; internal const string Direction = "Direction"; internal const string ElementType = "ElementType"; internal const string Expression = "Expression"; internal const string False = "false"; internal const string Function = "Function"; internal const string InheritanceCode = "InheritanceCode"; internal const string IsComposable = "IsComposable"; internal const string IsDbGenerated = "IsDbGenerated"; internal const string IsDiscriminator = "IsDiscriminator"; internal const string IsPrimaryKey = "IsPrimaryKey"; internal const string IsInheritanceDefault = "IsInheritanceDefault"; internal const string IsForeignKey = "IsForeignKey"; internal const string IsUnique = "IsUnique"; internal const string IsVersion = "IsVersion"; internal const string MappingNamespace = "http://schemas.microsoft.com/linqtosql/mapping/2007"; internal const string Member = "Member"; internal const string Method = "Method"; internal const string Name = "Name"; internal const string CanBeNull = "CanBeNull"; internal const string OtherKey = "OtherKey"; internal const string Parameter = "Parameter"; internal const string Provider = "Provider"; internal const string Return = "Return"; internal const string Storage = "Storage"; internal const string Table = "Table"; internal const string ThisKey = "ThisKey"; internal const string True = "true"; internal const string Type = "Type"; internal const string UpdateCheck = "UpdateCheck"; } internal class TableMapping { string tableName; string member; TypeMapping rowType; internal TableMapping() { } internal string TableName { get { return this.tableName; } set { this.tableName = value; } } internal string Member { get { return this.member; } set { this.member = value; } } internal TypeMapping RowType { get { return this.rowType; } set { this.rowType = value; } } } internal class FunctionMapping { string name; string methodName; bool isComposable; Listparameters; List types; ReturnMapping funReturn; internal FunctionMapping() { this.parameters = new List (); this.types = new List (); } internal string Name { get { return this.name; } set { this.name = value; } } internal string MethodName { get { return this.methodName; } set { this.methodName = value; } } internal bool IsComposable { get { return this.isComposable; } set { this.isComposable = value; } } internal string XmlIsComposable { get { return this.isComposable ? XmlMappingConstant.True : null; } set { this.isComposable = (value != null) ? bool.Parse(value) : false; } } internal List Parameters { get { return this.parameters; } } internal List Types { get { return this.types; } } internal ReturnMapping FunReturn { get { return this.funReturn; } set { this.funReturn = value; } } } internal enum MappingParameterDirection { In, Out, InOut } internal class ParameterMapping { string name; string parameterName; string dbType; MappingParameterDirection direction; internal string Name { get { return this.name; } set { this.name = value; } } internal string ParameterName { get { return this.parameterName; } set { this.parameterName = value; } } internal string DbType { get { return this.dbType; } set { this.dbType = value; } } public string XmlDirection { get { return this.direction == MappingParameterDirection.In ? null : this.direction.ToString(); } set { this.direction = (value == null) ? MappingParameterDirection.In : (MappingParameterDirection)Enum.Parse(typeof(MappingParameterDirection), value, true); } } public MappingParameterDirection Direction { get { return this.direction; } set { this.direction = value; } } } internal class ReturnMapping { string dbType; internal string DbType { get { return this.dbType; } set { this.dbType = value; } } } internal class TypeMapping { string name; TypeMapping baseType; List members; string inheritanceCode; bool isInheritanceDefault; List derivedTypes; internal TypeMapping() { this.members = new List (); this.derivedTypes = new List (); } internal TypeMapping BaseType { get { return this.baseType; } set { this.baseType = value; } } internal string Name { get { return this.name; } set { this.name = value; } } internal List Members { get { return this.members; } } internal string InheritanceCode { get { return this.inheritanceCode; } set { this.inheritanceCode = value; } } internal bool IsInheritanceDefault { get { return this.isInheritanceDefault; } set { this.isInheritanceDefault = value; } } internal string XmlIsInheritanceDefault { get { return this.isInheritanceDefault ? XmlMappingConstant.True : null; } set { this.isInheritanceDefault = (value != null) ? bool.Parse(value) : false; } } internal List DerivedTypes { get { return this.derivedTypes; } } } internal abstract class MemberMapping { string name; string member; string storageMember; internal MemberMapping() { } internal string DbName { get { return this.name; } set { this.name = value; } } internal string MemberName { get { return this.member; } set { this.member = value; } } internal string StorageMemberName { get { return this.storageMember; } set { this.storageMember = value; } } } internal sealed class ColumnMapping : MemberMapping { string dbType; string expression; bool isPrimaryKey; bool isDBGenerated; bool isVersion; bool isDiscriminator; bool? canBeNull = null; UpdateCheck updateCheck; AutoSync autoSync; internal ColumnMapping() { } internal string DbType { get { return this.dbType; } set { this.dbType = value; } } internal bool? CanBeNull { get { return this.canBeNull; } set { this.canBeNull = value; } } internal string XmlCanBeNull { get { if (this.canBeNull == null) return null; return this.canBeNull == true ? null : XmlMappingConstant.False; } set { this.canBeNull = (value != null) ? bool.Parse(value) : true; } } internal string Expression { get { return this.expression; } set { this.expression = value; } } internal bool IsPrimaryKey { get { return this.isPrimaryKey; } set { this.isPrimaryKey = value; } } internal string XmlIsPrimaryKey { get { return this.isPrimaryKey ? XmlMappingConstant.True : null; } set { this.isPrimaryKey = (value != null) ? bool.Parse(value) : false; } } internal bool IsDbGenerated { get { return this.isDBGenerated; } set { this.isDBGenerated = value; } } internal string XmlIsDbGenerated { get { return this.isDBGenerated ? XmlMappingConstant.True : null; } set { this.isDBGenerated = (value != null) ? bool.Parse(value) : false; } } internal bool IsVersion { get { return this.isVersion; } set { this.isVersion = value; } } internal string XmlIsVersion { get { return this.isVersion ? XmlMappingConstant.True : null; } set { this.isVersion = (value != null) ? bool.Parse(value) : false; } } internal bool IsDiscriminator { get { return this.isDiscriminator; } set { this.isDiscriminator = value; } } internal string XmlIsDiscriminator { get { return this.isDiscriminator ? XmlMappingConstant.True : null; } set { this.isDiscriminator = (value != null) ? bool.Parse(value) : false; } } internal UpdateCheck UpdateCheck { get { return this.updateCheck; } set { this.updateCheck = value; } } internal string XmlUpdateCheck { get { return this.updateCheck != UpdateCheck.Always ? this.updateCheck.ToString() : null; } set { this.updateCheck = (value == null) ? UpdateCheck.Always : (UpdateCheck)Enum.Parse(typeof(UpdateCheck), value); } } internal AutoSync AutoSync { get { return this.autoSync; } set { this.autoSync = value; } } internal string XmlAutoSync { get { return this.autoSync != AutoSync.Default ? this.autoSync.ToString() : null; } set { this.autoSync = (value != null) ? (AutoSync)Enum.Parse(typeof(AutoSync), value) : AutoSync.Default; } } } internal sealed class AssociationMapping : MemberMapping { string thisKey; string otherKey; string deleteRule; bool deleteOnNull; bool isForeignKey; bool isUnique; internal AssociationMapping() { } internal string ThisKey { get { return this.thisKey; } set { this.thisKey = value; } } internal string OtherKey { get { return this.otherKey; } set { this.otherKey = value; } } internal string DeleteRule { get { return this.deleteRule; } set { this.deleteRule = value; } } internal bool DeleteOnNull { get { return this.deleteOnNull; } set { this.deleteOnNull = value; } } internal bool IsForeignKey { get { return this.isForeignKey; } set { this.isForeignKey = value; } } internal string XmlIsForeignKey { get { return this.isForeignKey ? XmlMappingConstant.True : null; } set { this.isForeignKey = (value != null) ? bool.Parse(value) : false; } } internal string XmlDeleteOnNull { get { return this.deleteOnNull ? XmlMappingConstant.True : null; } set { this.deleteOnNull = (value != null) ? bool.Parse(value) : false; } } internal bool IsUnique { get { return this.isUnique; } set { this.isUnique = value; } } internal string XmlIsUnique { get { return this.isUnique ? XmlMappingConstant.True : null; } set { this.isUnique = (value != null) ? bool.Parse(value) : false; } } } /// /// Shared rules governing the mapping system. /// internal static class MappingSystem { ////// Return true if this is a clr type supported as an inheritance discriminator. /// /// ///internal static bool IsSupportedDiscriminatorType(Type type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { type = type.GetGenericArguments()[0]; } switch (Type.GetTypeCode(type)) { case TypeCode.Byte: case TypeCode.SByte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: case TypeCode.Char: case TypeCode.String: case TypeCode.Boolean: return true; } return false; } /// /// Return true if this is a clr type supported as an inheritance discriminator. /// /// ///internal static bool IsSupportedDiscriminatorType(SqlDbType type) { switch (type) { case SqlDbType.BigInt: case SqlDbType.Bit: case SqlDbType.Char: case SqlDbType.Int: case SqlDbType.NChar: case SqlDbType.NVarChar: case SqlDbType.SmallInt: case SqlDbType.TinyInt: case SqlDbType.VarChar: return true; } return false; } /// /// Return true if this is a CLR type supported as an identity member. Since identity /// management (caching) relies on key members being hashable, only types implementing /// GetHashCode are supported. Also, the runtime relies on identity members being comparable, /// so only types implementing Equals are supported. /// internal static bool IsSupportedIdentityType(Type type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { type = type.GetGenericArguments()[0]; } if (type == typeof(Guid) || type == typeof(DateTime) || type == typeof(DateTimeOffset) || type == typeof(TimeSpan) || type == typeof(Binary)) { return true; } switch (Type.GetTypeCode(type)) { case TypeCode.Byte: case TypeCode.SByte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: case TypeCode.Char: case TypeCode.String: case TypeCode.Boolean: case TypeCode.Decimal: case TypeCode.Single: case TypeCode.Double: return true; } return false; } ////// Types that do not support comparison cannot be used as primary keys. The /// database will restrict this, but we can't rely on that, since it is possible /// to create a key mapping to a column that isn't truly a key in the DB. /// internal static bool IsSupportedIdentityType(SqlDbType type) { switch (type) { case SqlDbType.NText: case SqlDbType.Image: case SqlDbType.Xml: case SqlDbType.Text: case SqlDbType.Variant: case SqlDbType.Udt: return false; default: return true; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- KnownTypesProvider.cs
- Helpers.cs
- WSHttpBindingBaseElement.cs
- TableCellCollection.cs
- SqlParameterCollection.cs
- Unit.cs
- OdbcFactory.cs
- ProvidePropertyAttribute.cs
- BindingBase.cs
- ComponentResourceManager.cs
- Int32EqualityComparer.cs
- ObjectDataSourceEventArgs.cs
- CustomAttributeBuilder.cs
- _NtlmClient.cs
- ResourceWriter.cs
- TypedDataSetSchemaImporterExtensionFx35.cs
- UriScheme.cs
- SortDescription.cs
- HostProtectionException.cs
- SafeNativeMethods.cs
- DispatchChannelSink.cs
- _IPv6Address.cs
- StrokeCollectionDefaultValueFactory.cs
- InvalidOleVariantTypeException.cs
- WebHttpDispatchOperationSelector.cs
- OutputCacheSettingsSection.cs
- GetPageNumberCompletedEventArgs.cs
- IsolatedStorageException.cs
- HtmlPanelAdapter.cs
- BaseTransportHeaders.cs
- XsltFunctions.cs
- DragDrop.cs
- CommandValueSerializer.cs
- PropertyMetadata.cs
- UIElement.cs
- NativeBuffer.cs
- EditorZone.cs
- UserControlAutomationPeer.cs
- ContractCodeDomInfo.cs
- Vector3DKeyFrameCollection.cs
- ActivityPreviewDesigner.cs
- panel.cs
- GenerateScriptTypeAttribute.cs
- OleDbMetaDataFactory.cs
- UdpTransportBindingElement.cs
- ServiceModelTimeSpanValidator.cs
- ActionMessageFilterTable.cs
- TimeoutHelper.cs
- DiscreteKeyFrames.cs
- CollectionViewGroup.cs
- SafeFileHandle.cs
- StreamSecurityUpgradeAcceptorBase.cs
- PrefixHandle.cs
- ModuleBuilderData.cs
- WindowInteractionStateTracker.cs
- EventSetter.cs
- SimpleWorkerRequest.cs
- MultilineStringEditor.cs
- ObjectContext.cs
- BindingMAnagerBase.cs
- ChtmlPhoneCallAdapter.cs
- MimeTypeMapper.cs
- LocatorManager.cs
- InputBuffer.cs
- FileStream.cs
- CapabilitiesRule.cs
- SystemEvents.cs
- TableAdapterManagerGenerator.cs
- GridEntryCollection.cs
- Parser.cs
- SqlFunctionAttribute.cs
- Code.cs
- NavigationPropertyEmitter.cs
- WebPart.cs
- ScriptRef.cs
- SettingsSavedEventArgs.cs
- TypeDescriptionProvider.cs
- SendKeys.cs
- SymmetricSecurityProtocol.cs
- BamlTreeMap.cs
- SocketAddress.cs
- ApplyTemplatesAction.cs
- SafeRegistryKey.cs
- AutomationEventArgs.cs
- TextTreePropertyUndoUnit.cs
- RadioButtonPopupAdapter.cs
- JavaScriptObjectDeserializer.cs
- XmlSchemaChoice.cs
- RealizationContext.cs
- SHA1Managed.cs
- Rfc2898DeriveBytes.cs
- InlineUIContainer.cs
- VisualTreeHelper.cs
- WorkflowCreationContext.cs
- SignedPkcs7.cs
- PrincipalPermission.cs
- CultureInfoConverter.cs
- VersionedStream.cs
- DateTimeValueSerializerContext.cs
- OptionUsage.cs