/// <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; }
public AttributeMappingMember(MemberInfo member, MemberAttribute attribute, AttributeMappingEntity nested) { this.member = member; this.attribute = attribute; this.nested = nested; }
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)); }