public virtual DbTypeInfo GetDbTypeInfo(EntityMemberInfo forMember) { var colType = forMember.DataType.GetUnderlyingStorageClrType(); if (DbTypesByClrType.TryGetValue(colType, out var typeInfo)) { return(typeInfo); } // direct mapping by col type (CLR type) not found. DbTypeDef storageType = null; // find by value kind var mappedTo = GetDbSpecialType(colType, forMember); if (mappedTo != DbSpecialType.None) { SpecialTypeDefs.TryGetValue(mappedTo, out storageType); } // if not found try by col type if (storageType == null) { TypeDefsByColumnOutType.TryGetValue(colType, out storageType); } if (storageType == null) { return(null); } // found storage type; try default mapping if (storageType.DefaultTypeInfo != null) { return(storageType.DefaultTypeInfo); } // create new mapping return(CreateDbTypeInfo(colType, storageType, forMember.Size, forMember.Precision, forMember.Scale)); }
// this method is used at runtime in LINQ queries public virtual DbTypeDef GetDbTypeDef(Type dataType) { var colType = dataType.GetUnderlyingStorageClrType(); if (DbTypesByClrType.TryGetValue(colType, out DbTypeInfo typeInfo)) { return(typeInfo.TypeDef); } // for string make quick lookup if (colType == typeof(string) && SpecialTypeDefs.TryGetValue(DbSpecialType.String, out var typeDef)) { return(typeDef); } // make plain search for matching type return(TypeDefsByName.Values.FirstOrDefault(td => td.ColumnOutType == colType && !td.Flags.IsSet(DbTypeFlags.Unlimited))); }