Ejemplo n.º 1
0
        /// <summary>
        /// Cria a chave de registro da instancia.
        /// </summary>
        /// <param name="recordKeyFactory"></param>
        /// <returns></returns>
        public Query.RecordKey CreateRecordKey(Query.IRecordKeyFactory recordKeyFactory)
        {
            recordKeyFactory.Require("recordKeyFactory").NotNull();
            var typeName  = Colosoft.Reflection.TypeName.Get(GetType());
            var keyFields = recordKeyFactory.GetKeyFields(typeName).ToArray();

            if (keyFields.Length == 0)
            {
                return(new Query.RecordKey(string.Empty, 0));
            }
            var instanceType = GetType();
            var properties   = instanceType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic).Where(f => f.CanRead && keyFields.Contains(f.Name));
            var fields       = new List <Query.Record.Field>();
            var values       = new List <object>();

            foreach (var property in properties)
            {
                if (CreateRecordIgnoreProperty(property.Name))
                {
                    continue;
                }
                fields.Add(new Query.Record.Field(property.Name, property.PropertyType));
                values.Add(property.GetValue(this, null));
            }
            var descriptor = new Query.Record.RecordDescriptor(instanceType.FullName, fields);

            return(recordKeyFactory.Create(typeName, descriptor.CreateRecord(values.ToArray())));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Recupera o registrao associado com a ação.
        /// </summary>
        /// <param name="action">Instancia da ação de persistencia realizada.</param>
        /// <param name="record">Registro gerado.</param>
        /// <param name="recordKey">Chave do registro.</param>
        /// <returns>Nome do tipo associado.</returns>
        private Colosoft.Reflection.TypeName GetActionRecord(PersistenceAction action, out Query.Record record, out Query.RecordKey recordKey)
        {
            var typeName     = new Reflection.TypeName(action.EntityFullName);
            var typeMetadata = TypeSchema.GetTypeMetadata(action.EntityFullName);
            var typeFields   = GetRecordFields(action.EntityFullName, typeMetadata);
            var fields       = new List <Query.Record.Field>();
            var recordValues = new List <object>();

            foreach (var actionParameter in action.Parameters)
            {
                var indexOf = 0;
                for (; indexOf < typeFields.Count; indexOf++)
                {
                    if (typeFields[indexOf].Name == actionParameter.Name)
                    {
                        break;
                    }
                }
                if (indexOf < typeFields.Count)
                {
                    fields.Add(new Query.Record.Field(typeFields[indexOf].Name, typeFields[indexOf].Type));
                    recordValues.Add(actionParameter.Value);
                }
            }
            if (typeMetadata.IsVersioned && !fields.Any(f => f.Name == "RowVersion"))
            {
                fields.Add(new Query.Record.Field("RowVersion", typeof(long)));
                recordValues.Add(action.RowVersion);
            }
            var recordDescriptor = new Query.Record.RecordDescriptor("default", fields);

            record    = recordDescriptor.CreateRecord(recordValues.ToArray());
            recordKey = RecordKeyFactory.Create(typeName, record);
            return(typeName);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Cria um registro a partir dos dados da instancia.
        /// </summary>
        /// <returns></returns>
        public virtual Query.Record CreateRecord()
        {
            var instanceType = GetType();
            var properties   = instanceType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic).Where(f => f.CanRead);
            var fields       = new List <Query.Record.Field>();
            var values       = new List <object>();

            foreach (var property in properties)
            {
                if (CreateRecordIgnoreProperty(property.Name))
                {
                    continue;
                }
                fields.Add(new Query.Record.Field(property.Name, property.PropertyType));
                values.Add(property.GetValue(this, null));
            }
            var descriptor = new Query.Record.RecordDescriptor(instanceType.FullName, fields);

            return(descriptor.CreateRecord(values.ToArray()));
        }