Beispiel #1
0
        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));
        }
Beispiel #2
0
        // 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)));
        }