Exemplo n.º 1
0
        /// <summary>
        /// Create a <see cref="MappingEntity"/>.
        /// </summary>
        /// <param name="entityType">The entity type this mapping is for.</param>
        /// <param name="entityId">The mapping id of the entity type.</param>
        /// <param name="parent"></param>
        private MappingEntity CreateEntity(Type entityType, string entityId, ParentEntity parent)
        {
            var members        = new HashSet <string>();
            var mappingMembers = new List <AttributeMappingMember>();

            // get the attributes given the type that has the mappings (root type, in case of nested entity)
            var mappingAttributes = this.GetMappingAttributes(entityType, entityId, parent);

            var tableAttributes = mappingAttributes.OfType <TableBaseAttribute>()
                                  .OrderBy(ta => ta.Name);

            var staticType  = entityType;
            var runtimeType = entityType;

            // check to see if mapping attributes tell us about a different runtime.
            var entityAttr = mappingAttributes.OfType <EntityAttribute>().FirstOrDefault();

            if (entityAttr != null && entityAttr.RuntimeType != null && parent == null)
            {
                runtimeType = entityAttr.RuntimeType;
            }

            var memberAttributes = mappingAttributes.OfType <MemberAttribute>()
                                   .OrderBy(ma => ma.Member);

            foreach (var attr in memberAttributes)
            {
                if (string.IsNullOrEmpty(attr.Member))
                {
                    continue;
                }

                var                    memberName = attr.Member;
                MemberInfo             member     = null;
                MemberAttribute        attribute  = null;
                AttributeMappingEntity nested     = null;

                var nestedEntity = attr as NestedEntityAttribute;
                if (nestedEntity != null)
                {
                    members.Add(memberName);
                    member = this.FindMember(entityType, memberName);
                    var nestedEntityId   = entityId + "." + memberName;
                    var nestedEntityType = TypeHelper.GetMemberType(member);
                    nested = (AttributeMappingEntity)this.GetEntity(nestedEntityType, nestedEntityId, new ParentEntity(parent, member, entityType, entityId));
                }
                else
                {
                    if (members.Contains(memberName))
                    {
                        throw new InvalidOperationException(string.Format("AttributeMapping: more than one mapping attribute specified for member '{0}' on type '{1}'", memberName, entityType.Name));
                    }

                    member    = this.FindMember(entityType, memberName);
                    attribute = attr;
                }

                mappingMembers.Add(new AttributeMappingMember(member, attribute, nested));
            }

            return(new AttributeMappingEntity(staticType, runtimeType, entityId, tableAttributes, mappingMembers));
        }
 internal AttributeMappingMember(MemberInfo member, MemberAttribute attribute, AttributeMappingEntity nested)
 {
     this._member = member;
     this._attribute = attribute;
     this._nested = nested;
 }
Exemplo n.º 3
0
 public AttributeMappingMember(MemberInfo member, MemberAttribute attribute, AttributeMappingEntity nested)
 {
     this.member    = member;
     this.attribute = attribute;
     this.nested    = nested;
 }
Exemplo n.º 4
0
        private MappingEntity CreateEntity(Type elementType, string tableId, Type entityType)
        {
            if (tableId == null)
            {
                tableId = this.GetTableId(elementType);
            }
            var members           = new HashSet <string>();
            var mappingMembers    = new List <AttributeMappingMember>();
            int dot               = tableId.IndexOf('.');
            var rootTableId       = dot > 0 ? tableId.Substring(0, dot) : tableId;
            var path              = dot > 0 ? tableId.Substring(dot + 1) : "";
            var mappingAttributes = this.GetMappingAttributes(rootTableId);
            var tableAttributes   = mappingAttributes.OfType <TableBaseAttribute>()
                                    .OrderBy(ta => ta.Name);
            var tableAttr = tableAttributes.OfType <TableAttribute>().FirstOrDefault();

            if (tableAttr != null && tableAttr.EntityType != null && entityType == elementType)
            {
                entityType = tableAttr.EntityType;
            }
            var memberAttributes = mappingAttributes.OfType <MemberAttribute>()
                                   .Where(ma => ma.Member.StartsWith(path))
                                   .OrderBy(ma => ma.Member);

            foreach (var attr in memberAttributes)
            {
                if (string.IsNullOrEmpty(attr.Member))
                {
                    continue;
                }
                string                 memberName = (path.Length == 0) ? attr.Member : attr.Member.Substring(path.Length + 1);
                MemberInfo             member     = null;
                MemberAttribute        attribute  = null;
                AttributeMappingEntity nested     = null;
                if (memberName.Contains('.')) // additional nested mappings
                {
                    string nestedMember = memberName.Substring(0, memberName.IndexOf('.'));
                    if (nestedMember.Contains('.'))
                    {
                        continue; // don't consider deeply nested members yet
                    }
                    if (members.Contains(nestedMember))
                    {
                        continue; // already seen it (ignore additional)
                    }
                    members.Add(nestedMember);
                    member = this.FindMember(entityType, nestedMember);
                    string newTableId = tableId + "." + nestedMember;
                    nested = (AttributeMappingEntity)this.GetEntity(TypeHelper.GetMemberType(member), newTableId);
                }
                else
                {
                    if (members.Contains(memberName))
                    {
                        throw new InvalidOperationException(string.Format("AttributeMapping: more than one mapping attribute specified for member '{0}' on type '{1}'", memberName, entityType.Name));
                    }
                    member    = this.FindMember(entityType, memberName);
                    attribute = attr;
                }
                mappingMembers.Add(new AttributeMappingMember(member, attribute, nested));
            }
            return(new AttributeMappingEntity(elementType, tableId, entityType, tableAttributes, mappingMembers));
        }