/// <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()))); }
/// <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); }
/// <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())); }