Exemplo n.º 1
0
        /// <summary>
        /// Gets a value from a specific property.
        /// </summary>
        /// <remarks>
        /// If the IObjectWrapper is a proxy, this method fetches the IObject
        /// from the database and assigns it to this.UnderlyingObject
        /// </remarks>
        /// <exception cref="ActiveRecordAttributeException"></exception>
        /// <param name="propertyName">string</param>
        /// <returns>object</returns>
        public static object GetValue(this IActiveRecord wrapper, string propertyName)
        {
            if (wrapper.IsProxy)
            {
                wrapper.FetchUnderlyingObject();
            }

            if (wrapper.Deleted)
            {
                throw new ActiveRecordException("O objeto foi deletado e não é possível acessar seus atributos.");
            }

            FieldAttribute att = wrapper.GetFieldDefinition(typeof(FieldAttribute), propertyName);

            if (att == null)
            {
                throw new ActiveRecordAttributeException(wrapper.GetType(),
                                                         String.Format("Não foi possível localizar o atributo de campo para a propriedade {0}", propertyName));
            }

            if (att is DomainFieldAttribute)
            {
                return(GetDisplayValue(wrapper, att));
            }
            if (att is RelationshipAttribute)
            {
                return(FindRelatedObjects(wrapper, att));
            }

            if (att.FieldType == esriFieldType.esriFieldTypeBlob)
            {
                return(GetBlobValue(wrapper, att));
            }

            return(att.Index == -1 ? null : wrapper.UnderlyingObject.get_Value(att.Index));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Sets a value from a specific property.
        /// </summary>
        /// <exception cref="ActiveRecordAttributeException"></exception>
        /// <param name="propertyName">string</param>
        /// <param name="value">object</param>
        public static void SetValue(this IActiveRecord wrapper, string propertyName, object value)
        {
            if (wrapper.IsProxy)
            {
                wrapper.FetchUnderlyingObject();
            }

            if (wrapper.Deleted)
            {
                throw new ActiveRecordException("Não é possível setar o valor deste atributo, pois o objeto foi deletado.");
            }

            var att = wrapper.GetFieldDefinition(typeof(FieldAttribute), propertyName);

            if (att == null)
            {
                throw new ActiveRecordAttributeException(wrapper.GetType(),
                                                         String.Format("Não foi possível localizar o atributo de campo para a propriedade {0}", propertyName));
            }

            if (att is DomainFieldAttribute)
            {
                SetDisplayValue(wrapper, att, value.ToString());
            }

            if (att is BelongsToAttribute)
            {
                BelongsToAttribute attribute = att as BelongsToAttribute;
                if (value == null)
                {
                    wrapper.UnderlyingObject.set_Value(attribute.ParentValueFieldIndex, DBNull.Value);
                }
                else
                {
                    wrapper.UnderlyingObject.set_Value(attribute.ParentValueFieldIndex, value);
                }


                return;
            }

            if (att is OneToOneAttribute)
            {
                OneToOneAttribute attribute = att as OneToOneAttribute;
                if (value == null)
                {
                    wrapper.UnderlyingObject.set_Value(attribute.RelatedAttributeIndex, DBNull.Value);
                }
                else
                {
                    wrapper.UnderlyingObject.set_Value(attribute.RelatedAttributeIndex, value);
                }
                return;
            }

            // if the field does not have an index, just exit
            if (att.Index == -1)
            {
                return;
            }

            // if the field cannot be null, but it is, throw a new exception
            if (att.NotNullable && value == null)
            {
                throw new ActiveRecordException(String.Format("O atributo {0} não pode ser nulo.", att.FieldName));
            }

            if (att.FieldType == esriFieldType.esriFieldTypeBlob)
            {
                SetBlobValue(wrapper, att, value);
                return;
            }
            if (value == null)
            {
                wrapper.UnderlyingObject.set_Value(att.Index, DBNull.Value);
            }
            else
            {
                wrapper.UnderlyingObject.set_Value(att.Index, value);
            }
        }