/// <summary> /// Identifica o inicio da carga do <see cref="Colosoft.Data.Schema.ITypeMetadata"/> /// informado. /// </summary> /// <param name="metadata"></param> public void OnBeginLoadTypeMetadata(Colosoft.Data.Schema.ITypeMetadata metadata) { lock (_observers) foreach (var i in _observers) { if (i is IDataCacheLoaderObserver) { ((IDataCacheLoaderObserver)i).OnBeginLoadTypeMetadata(metadata); } } }
/// <summary> /// Identifica o fim da carga dos dados /// </summary> /// <param name="metadata"></param> /// <param name="exception"></param> public void OnEndLoadTypeMetadata(Colosoft.Data.Schema.ITypeMetadata metadata, Exception exception) { lock (_observers) foreach (var i in _observers) { if (i is IDataCacheLoaderObserver) { ((IDataCacheLoaderObserver)i).OnEndLoadTypeMetadata(metadata, exception); } } }
/// <summary> /// Recupera o nome da coluna associado com as informações da entidade. /// </summary> /// <param name="entity">Entidade</param> /// <param name="propertyName">Nome da propriedade</param> /// <param name="translatedName">Nome traduzido que foi encontrado.</param> /// <param name="error">Erro ocorrido.</param> /// <returns>Retorna o nome da entidade</returns> private bool TryGetName(Colosoft.Query.EntityInfo entity, string propertyName, out Colosoft.Query.ITranslatedName translatedName, out Exception error) { entity.Require("entity").NotNull(); entity.Require("columnName").NotNull(); Colosoft.Data.Schema.IPropertyMetadata propertyMetadata = null; Colosoft.Data.Schema.ITypeMetadata typeMetadata = null; try { typeMetadata = GetTypeMetadata(entity.FullName); propertyMetadata = typeMetadata[propertyName]; } catch { } string name; if (propertyMetadata == null) { if (StringComparer.InvariantCultureIgnoreCase.Equals(propertyName, "TableId")) { var identityMetadatas = typeMetadata.GetKeyProperties(); using (var identityEnumerator = identityMetadatas.GetEnumerator()) { identityEnumerator.MoveNext(); var identityMetadata = identityEnumerator.Current; if (identityEnumerator.MoveNext()) { translatedName = null; error = new NotSupportedException(ResourceMessageFormatter.Create(() => Properties.Resources.NotSupportedException_TableIdOnlySupportedInNonCompositePrimaryKeyTable, typeMetadata.FullName).Format()); return(false); } else { name = identityMetadata.Name; } } } else { name = propertyName; } } else { name = propertyMetadata.Name; } translatedName = new TranslatedPropertyName(name, entity.Alias, null); error = null; return(true); }
/// <summary> /// Recupera usado para recupera a consulta associada com a ação. /// </summary> /// <param name="action"></param> /// <param name="typeMetadata"></param> /// <returns></returns> private Query.Queryable GetActionQuery(PersistenceAction action, Colosoft.Data.Schema.ITypeMetadata typeMetadata) { var query = _sourceContext.CreateQuery(); StringBuilder wherePart = new StringBuilder(); List <QueryParameter> wherePartParameters = new List <QueryParameter>(); bool isFirstWhere = true; for (int i = 0; i < action.Parameters.Count; i++) { var propertyMetadata = typeMetadata[action.Parameters[i].Name]; if (propertyMetadata != null && (propertyMetadata.ParameterType == Colosoft.Data.Schema.PersistenceParameterType.IdentityKey || propertyMetadata.ParameterType == Colosoft.Data.Schema.PersistenceParameterType.Key)) { if (action.Conditional != null) { continue; } wherePartParameters.Add(new QueryParameter("?" + action.Parameters[i].Name, action.Parameters[i].Value)); if (!isFirstWhere) { wherePart.Append(" && "); } else { isFirstWhere = false; } wherePart.Append(action.Parameters[i].Name).Append("=?").Append(action.Parameters[i].Name); } } if (action.Conditional == null && wherePart.Length > 0) { query.WhereClause = ConditionalContainer.Parse(wherePart.ToString(), wherePartParameters.ToArray()); } else if (action.Conditional != null) { query.WhereClause = action.Conditional; } query.From(new EntityInfo() { Alias = null, FullName = typeMetadata.FullName }); return(query); }
/// <summary> /// Recupera os campos do registro. /// </summary> /// <param name="entityFullName"></param> /// <param name="typeMetadata"></param> /// <returns></returns> private static List <Record.Field> GetRecordFields(string entityFullName, Colosoft.Data.Schema.ITypeMetadata typeMetadata) { var recordFields = new List <Colosoft.Query.Record.Field>(); foreach (var propertyMetadata in typeMetadata) { Type propertyType = null; try { propertyType = Type.GetType(propertyMetadata.PropertyType, true); } catch (Exception ex) { throw new Exception(ResourceMessageFormatter.Create(() => Properties.Resources.CachePersistenceExecuter_GetPropertyTypeFromPropertyMetadataError, propertyMetadata.PropertyType, propertyMetadata.Name, entityFullName).Format(), ex); } recordFields.Add(new Colosoft.Query.Record.Field(propertyMetadata.Name, propertyType)); } if (typeMetadata.IsVersioned && !recordFields.Exists(f => StringComparer.InvariantCultureIgnoreCase.Equals(f.Name, "RowVersion"))) { recordFields.Add(new Colosoft.Query.Record.Field("RowVersion", typeof(long))); } return(recordFields); }