示例#1
0
 public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
 {
     if (propertyInfo.GetCustomAttribute <TimestampAttribute>() == null)
     {
         return;
     }
     columnInfo.IsTimestamp = true;
     logger.Log(typeof(TimestampAttributeUpdater), nameof(UpdateColumnInfo),
                $"{columnInfo.ColumnName}.IsTimestamp=true");
     columnInfo.IsDatabaseGenerated = true;
     logger.Log(typeof(TimestampAttributeUpdater), nameof(UpdateColumnInfo),
                $"{columnInfo.ColumnName}.IsDatabaseGenerated=true");
 }
示例#2
0
        public static bool GetDefaultIsUnicodeText(Type dbContextType, IShamanLogger logger)
        {
            var fromAttribute = dbContextType.GetTypeInfo().GetCustomAttribute <UnicodeTextAttribute>()?.IsUnicode;

            if (fromAttribute != null)
            {
                logger.Log(typeof(DefaultSchemaUpdater), nameof(GetDefaultIsUnicodeText),
                           "Default UnicodeText from " + nameof(UnicodeTextAttribute) + ": " + fromAttribute);
                return(fromAttribute.Value);
            }

            logger.Log(typeof(DefaultSchemaUpdater), nameof(GetDefaultIsUnicodeText),
                       "Default UnicodeText = true");
            return(true);
        }
示例#3
0
        public void UpdateColumnInfoInModelInfo(ColumnInfo columnInfo,
                                                IDbSetInfo dbSetInfo, IShamanLogger logger)
        {
            if (columnInfo.ClrProperty?.GetCustomAttribute <TimestampAttribute>() == null)
            {
                return;
            }
            var          logPrefix = $"Set {dbSetInfo.TableName}.{columnInfo.ColumnName}";
            const string logSource =
                nameof(TimestampAttributeUpdater) + "." + nameof(UpdateColumnInfoOnModelCreating);

            columnInfo.IsTimestamp = true;
            logger.Log(logSource, $"{logPrefix}.IsTimestamp=true");
            columnInfo.IsDatabaseGenerated = true;
            logger.Log(logSource, $"{logPrefix}.IsDatabaseGenerated=true");
        }
示例#4
0
        public void UpdateColumnInfoInModelInfo(ColumnInfo columnInfo,
                                                IDbSetInfo dbSetInfo, IShamanLogger logger)
        {
            var attribute = columnInfo.ClrProperty?.GetCustomAttribute <NavigationPropertyAttribute>();

            if (attribute == null)
            {
                return;
            }
            Action <string> log =
                txt => logger.Log(typeof(NavigationPropertyAttributeUpdater), nameof(UpdateColumnInfoOnModelCreating),
                                  txt);
            var targetType = attribute.ForceNavigation ? "navigation" : "non-navigation";

            if (columnInfo.IsNavigationProperty == attribute.ForceNavigation)
            {
                log(
                    $"column {columnInfo.ColumnName} has been already set as {targetType} property. NavigationPropertyAttribute is not necessary.");
            }
            else
            {
                columnInfo.IsNavigationProperty = attribute.ForceNavigation;
                log($"column {columnInfo.ColumnName} is {targetType} property because of NavigationPropertyAttribute");
            }
        }
        public void UpdateColumnInfoOnModelCreating(IDbSetInfo dbSetInfo,
                                                    ColumnInfo columnInfo,
                                                    EntityTypeBuilder entityBuilder,
                                                    IShamanLogger logger)
        {
            const string source = nameof(SqlServerReflectionService) + "." + nameof(UpdateColumnInfoOnModelCreating);

            if (!UseDataType)
            {
                return;
            }
            if (columnInfo.ClrProperty?.PropertyType != typeof(string))
            {
                return;
            }
            var modelInfo = dbSetInfo.Model;
            var collation = GetCollation(columnInfo, dbSetInfo, modelInfo);

            if (string.IsNullOrEmpty(collation))
            {
                logger.Log(source, $"Column {dbSetInfo.GetSqlTableName()}.{columnInfo.PropertyName} has no SQL collation info");
                return;
            }

            var isUnicode   = columnInfo.IsUnicode ?? modelInfo.DefaultIsUnicodeText;
            var sqlDataType = SqlServerFixerService.MkStringType(isUnicode, columnInfo.MaxLength, collation);
            var action      = $"{columnInfo.PropertyName}.HasColumnType(\"{sqlDataType}\")";

            logger.LogCalling(source, dbSetInfo.EntityType, action);
            entityBuilder.Property(columnInfo.PropertyName).HasColumnType(sqlDataType);
        }
        public static void SetRawModel(Type type, IMutableModel model, IShamanLogger logger)
        {
            void Log(string message)
            {
                logger.Log(typeof(ModelsCachedContainer), nameof(SetRawModel), message);
            }

            string MutableEntityTypeToString(IMutableEntityType mutableEntityType)
            {
                try
                {
                    var r = mutableEntityType.Relational();
                    return($"{r.Schema}.{r.TableName}");
                }
                catch (Exception e)
                {
                    logger.LogException(Guid.Parse("{22CC8890-B871-45BF-890E-9341B41183F6}"), e);
                    return("??");
                }
            }

            var value  = EfModelWrapper.FromModel(model);
            var result = Cache.TryAdd(type, value);

            Log(result ? "Success" : "Skipped");
        }
 public static void Log(this IShamanLogger src, string source, string message)
 {
     if (!src.IsNullOrEmpty())
     {
         src.Log(new ShamanLogMessage(source, message));
     }
 }
        public void UpdateDbSetInfo(DbSetInfo dbSetInfo, Type entityType, Type contextType, IShamanLogger logger)
        {
            var tableAttribute = entityType.GetTypeInfo().GetCustomAttribute <TableAttribute>();

            if (tableAttribute == null || _ignoreTableAttribute)
            {
                dbSetInfo.TableName = _prefix + dbSetInfo.TableName;
                logger.Log(typeof(PrefixedTableNameService), nameof(UpdateDbSetInfo),
                           $"Set TableName='{dbSetInfo.TableName}', prefix='{_prefix}')");
            }
        }
 private static void UpdateAnnotation(IShamanAnnotatable annotatable, string collation, IShamanLogger logger,
                                      string target)
 {
     if (string.IsNullOrEmpty(collation))
     {
         return;
     }
     logger.Log(nameof(SqlServerReflectionService),
                $"Set annotation['{Ck}']='{collation}' for {target}");
     annotatable.Annotations[Ck] = collation;
 }
示例#10
0
        public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
        {
            var indexAttribute = propertyInfo.GetCustomAttribute <UnicodeTextAttribute>();

            if (indexAttribute == null)
            {
                return;
            }
            logger.Log(typeof(UnicodeTextAttribute), nameof(UpdateColumnInfo),
                       $"Set IsUnicode={indexAttribute.IsUnicode}");
            columnInfo.IsUnicode = indexAttribute.IsUnicode;
        }
        public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
        {
            var attribute = propertyInfo.GetCustomAttribute <ColumnAttribute>();

            if (attribute == null)
            {
                return;
            }
            if (!string.IsNullOrEmpty(attribute.Name))
            {
                columnInfo.ColumnName = attribute.Name;
                logger.Log(typeof(ColumnAttributeUpdater), "UpdateColumnInfo",
                           $"Set ColumnName='{columnInfo.ColumnName}'");
            }
            if (attribute.Order >= 0)
            {
                columnInfo.ForceFieldOrder = attribute.Order;
                logger.Log(typeof(ColumnAttributeUpdater), "UpdateColumnInfo",
                           $"Set ForceFieldOrder={columnInfo.ForceFieldOrder}");
            }
        }
示例#12
0
        public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
        {
            var attribute = propertyInfo.GetCustomAttribute <RequiredAttribute>();

            if (attribute == null)
            {
                return;
            }
            columnInfo.NotNull = true;
            logger.Log(typeof(RequiredAttributeUpdater), nameof(UpdateColumnInfo),
                       $"Set NotNull=true for column '{columnInfo.ColumnName}'");
        }
        public void UpdateColumnInfoInModelInfo(ColumnInfo columnInfo,
                                                IDbSetInfo dbSetInfo, IShamanLogger logger)
        {
            var indexAttribute = columnInfo.ClrProperty?.GetCustomAttribute <UnicodeTextAttribute>();

            if (indexAttribute == null)
            {
                return;
            }
            logger.Log(typeof(UnicodeTextAttribute), nameof(UpdateColumnInfoOnModelCreating),
                       $"Set IsUnicode={indexAttribute.IsUnicode}");
            columnInfo.IsUnicode = indexAttribute.IsUnicode;
        }
        public static string GetDefaultSchema(Type type, EfModelWrapper model, IShamanLogger logger)
        {
            var schema = type.GetTypeInfo().GetCustomAttribute <DefaultSchemaAttribute>()?.Schema?.Trim();

            if (!string.IsNullOrEmpty(schema))
            {
                logger.Log(typeof(DefaultSchemaUpdater), nameof(GetDefaultSchema),
                           "Default schema from " + nameof(DefaultSchemaAttribute) + ": " + schema);
                return(schema);
            }
            schema = model.DefaultSchema;
            return(schema);
        }
        public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
        {
            var indexAttribute = propertyInfo.GetCustomAttribute <DecimalTypeAttribute>();

            if (indexAttribute == null)
            {
                return;
            }
            logger.Log(typeof(DecimalTypeAttributeUpdater), nameof(UpdateColumnInfo),
                       $"Set MaxLength={indexAttribute.Length}, DecimalPlaces={indexAttribute.DecimalPlaces} for column '{columnInfo.ColumnName}'");
            columnInfo.MaxLength     = indexAttribute.Length;
            columnInfo.DecimalPlaces = indexAttribute.DecimalPlaces;
        }
示例#16
0
        public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
        {
            var attribute = propertyInfo.GetCustomAttribute <SqlServerCollationAttribute>();
            var collation = attribute?.Collation?.Trim();

            if (string.IsNullOrEmpty(collation))
            {
                return;
            }
            logger.Log(typeof(SqlServerReflectionService), nameof(UpdateColumnInfo),
                       $"Set annotation['{Ck}']='{collation}' for column '{columnInfo.ColumnName}'");
            columnInfo.Annotations[Ck] = collation;
        }
        public void UpdateColumnInfoInModelInfo(ColumnInfo columnInfo,
                                                IDbSetInfo dbSetInfo, IShamanLogger logger)
        {
            var attribute = columnInfo.ClrProperty?.GetCustomAttribute <ColumnAttribute>();

            if (attribute == null)
            {
                return;
            }
            const string logSource = nameof(ColumnInfoColumnAttributeUpdater) + "." + nameof(UpdateColumnInfoInModelInfo);

            if (!string.IsNullOrEmpty(attribute.Name))
            {
                columnInfo.ColumnName = attribute.Name;
                logger.Log(logSource, $"Set {dbSetInfo.TableName}.{columnInfo.ColumnName}.ColumnName='{columnInfo.ColumnName}'");
            }

            if (attribute.Order >= 0)
            {
                columnInfo.ForceFieldOrder = attribute.Order;
                logger.Log(logSource, $"Set {dbSetInfo.TableName}.{columnInfo.ColumnName}.ForceFieldOrder={columnInfo.ForceFieldOrder}");
            }
        }
示例#18
0
        public static void Log(this IShamanLogger src, Type t, string method, string message)
        {
            if (src.IsNullOrEmpty())
            {
                return;
            }
            var info = new ShamanLogMessage
            {
                Source  = $"{t.Name}.{method}",
                Message = message
            };

            src.Log(info);
        }
示例#19
0
        public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
        {
            var at = propertyInfo.GetCustomAttribute <DatabaseGeneratedAttribute>();

            if (at == null)
            {
                return;
            }
            logger.Log(
                typeof(DatabaseGeneratedAttributeUpdater),
                nameof(UpdateColumnInfo),
                $"Set IsDatabaseGenerated=true and DatabaseGeneratedOption.Identity for column {columnInfo.ColumnName}");
            columnInfo.IsDatabaseGenerated = true;
            columnInfo.IsIdentity          = at.DatabaseGeneratedOption == DatabaseGeneratedOption.Identity;
        }
示例#20
0
        public void UpdateDbSetInfo(DbSetInfo dbSetInfo, Type entityType, Type contextType, IShamanLogger logger)
        {
            var ta = entityType.GetTypeInfo().GetCustomAttribute <TableAttribute>();

            if (ta == null)
            {
                return;
            }
            dbSetInfo.TableName = ta.Name;
            if (!string.IsNullOrEmpty(ta.Schema))
            {
                dbSetInfo.Schema = ta.Schema;
            }
            logger.Log(typeof(TableAttributeUpdater), nameof(UpdateDbSetInfo),
                       $"Set Schema='{dbSetInfo.Schema}' for table '{dbSetInfo.TableName}'");
        }
示例#21
0
 public static IShamanLogger Append(this IShamanLogger src, IShamanLogger another)
 {
     if (src.IsNullOrEmpty())
     {
         return(another ?? EmptyShamanLogger.Instance);
     }
     if (another.IsNullOrEmpty())
     {
         return(src ?? EmptyShamanLogger.Instance);
     }
     return(new MethodCallLogger(info =>
     {
         src.Log(info);
         another.Log(info);
     }));
 }
示例#22
0
        public void UpdateDbSetInfo(DbSetInfo dbSetInfo, Type entityType, Type contextType, IShamanLogger logger)
        {
            if (string.IsNullOrEmpty(dbSetInfo.Schema))
            {
                dbSetInfo.Schema = "dbo";
            }
            var attribute = entityType.GetTypeInfo().GetCustomAttribute <SqlServerCollationAttribute>();
            var collation = attribute?.Collation?.Trim();

            if (string.IsNullOrEmpty(collation))
            {
                return;
            }
            logger.Log(typeof(SqlServerReflectionService), nameof(UpdateDbSetInfo),
                       $"Set annotation['{Ck}']='{collation}' for table '{dbSetInfo.TableName}'");
            dbSetInfo.Annotations[Ck] = collation;
        }
示例#23
0
        private static IReadOnlyDictionary <Type, string> GetTableNamesFromModel(EfModelWrapper model,
                                                                                 IShamanLogger logger)
        {
            if (model == null)
            {
                return(null);
            }
            var result = new Dictionary <Type, string>();

            foreach (var entityType in model.EntityTypes)
            {
                result[entityType.ClrType] = entityType.TableName;
                logger.Log(typeof(ModelInfo), nameof(GetTableNamesFromModel),
                           $"Table name for {entityType.ClrType.Name}: {entityType.TableName}");
            }
            return(result);
        }
示例#24
0
        public void UpdateColumnInfoInModelInfo(ColumnInfo columnInfo,
                                                IDbSetInfo dbSetInfo, IShamanLogger logger)
        {
            var attribute = columnInfo.ClrProperty?.GetCustomAttribute <RequiredAttribute>();

            if (attribute == null)
            {
                return;
            }

            var          logPrefix = $"Set {dbSetInfo.TableName}.{columnInfo.ColumnName}";
            const string logSource =
                nameof(RequiredAttributeUpdater) + "." + nameof(UpdateColumnInfoInModelInfo);

            columnInfo.NotNull = true;
            logger.Log(logSource, $"{logPrefix}.NotNull=true");
        }
        public void UpdateColumnInfo(ColumnInfo columnInfo, PropertyInfo propertyInfo, IShamanLogger logger)
        {
            var indexAttributes = propertyInfo.GetCustomAttributes <AbstractIndexAttribute>()?.ToArray();

            if (indexAttributes == null || !indexAttributes.Any())
            {
                return;
            }
            foreach (var indexAttribute in indexAttributes)
            {
                var indexInfo = GetOrCreateColumnIndexInfo(columnInfo, indexAttribute)
                                .WithInfoFromAbstractIndexAttribute(indexAttribute)
                                .WithInfoFromUniqueIndexAttribute(indexAttribute as UniqueIndexAttribute)
                                .WithInfoFromFullTextIndexAttribute(indexAttribute as FullTextIndexAttribute);
                logger.Log(typeof(IndexAttributeUpdater), nameof(UpdateColumnInfo),
                           $"Set indexInfo: Order={indexInfo.Order}, IsDescending={indexInfo.IsDescending}, IndexType={indexInfo.IndexType}");
            }
        }
        public void UpdateDbSetInfo(DbSetInfo dbSetInfo, Type entityType, Type contextType, IShamanLogger logger)
        {
            var target = $"table {dbSetInfo.GetSqlTableName()}";

            if (string.IsNullOrEmpty(dbSetInfo.Schema))
            {
                dbSetInfo.Schema = UseDefaultTableSchema;
                logger.Log(nameof(SqlServerReflectionService),
                           $"Set table schema '{dbSetInfo.Schema}' for {target}, entity={entityType}");
            }

            var collation = GetCollation(entityType.GetTypeInfo());

            if (string.IsNullOrEmpty(collation))
            {
                return;
            }
            UpdateAnnotation(dbSetInfo, collation, logger, target);
        }
示例#27
0
        public void UpdateColumnInfoInModelInfo(ColumnInfo columnInfo,
                                                IDbSetInfo dbSetInfo, IShamanLogger logger)
        {
            var indexAttributes = columnInfo.ClrProperty?.GetCustomAttributes <AbstractIndexAttribute>()?.ToArray();

            if (indexAttributes == null || !indexAttributes.Any())
            {
                return;
            }
            foreach (var indexAttribute in indexAttributes)
            {
                var indexInfo = GetOrCreateColumnIndexInfo(columnInfo, indexAttribute)
                                .WithInfoFromAbstractIndexAttribute(indexAttribute)
                                .WithInfoFromUniqueIndexAttribute(indexAttribute as UniqueIndexAttribute)
                                .WithInfoFromFullTextIndexAttribute(indexAttribute as FullTextIndexAttribute);
                var target = $"column {dbSetInfo.Schema}.{dbSetInfo.TableName}.{columnInfo.ColumnName}";
                logger.Log(typeof(IndexAttributeUpdater), nameof(UpdateColumnInfoOnModelCreating),
                           $"Set indexInfo: Order={indexInfo.Order}, IsDescending={indexInfo.IsDescending}, IndexType={indexInfo.IndexType} for {target}");
            }
        }
示例#28
0
        private static EfModelWrapper GetModel(Type dbContextType, bool raw, IShamanLogger logger)
        {
            Action <string> log = message => logger.Log(typeof(ModelsCachedContainer), nameof(GetModelInternal),
                                                        message);

            try
            {
                var instance = new ModelsCachedContainer
                {
                    DbContextType = dbContextType,
                    Raw           = raw,
                    Logger        = logger
                };
                return(instance.GetModelInternal());
            }
            catch (Exception e)
            {
                log("Exception " + e.Message);
                throw;
            }
        }
        private static EfModelWrapper GetModel(Type dbContextType, bool raw, IShamanLogger logger)
        {
            Action <string> log = message => logger.Log(typeof(ModelsCachedContainer), nameof(GetModelInternal),
                                                        message);

            try
            {
                var instance = new ModelsCachedContainer
                {
                    DbContextType = dbContextType,
                    Raw           = raw,
                    Logger        = logger
                };
                return(instance.GetModelInternal());
            }
            catch (Exception e)
            {
                logger.LogException(Guid.Parse("{F0BA1A53-86D9-430D-99A7-4D5792C593EF}"), e);
                log("Exception " + e.Message);
                throw;
            }
        }
示例#30
0
 public static Action <string> CreateMethod(this IShamanLogger logger, Type type, string method)
 {
     return(txt => logger.Log(type, method, txt));
 }