private void LoadCompositeKey() { var compositeKey = EntitySource.Root.Descendant("composite-id", XmlNamespace); if (compositeKey == null) { return; } var keys = compositeKey.Descendants("key-property", XmlNamespace); foreach (var key in keys) { var property = new NHibernateProperty(key, this); Key.Properties.Add(property); } var foreignKeys = compositeKey.Descendants("key-many-to-one", XmlNamespace); foreach (var foreignKey in foreignKeys) { var association = NHibernateAssociation.FromElement(this, foreignKey, foreignKey, AssociationType.ManyToOne, XmlNamespace); if (association != null) { if (!AssociationMap.ContainsKey(association.Name)) { AssociationMap.Add(association.Name, association); } Key.Associations.Add(association); } } }
protected override void LoadAssociations() { foreach (var associate in EntitySource.Root.Descendants("many-to-one", XmlNamespace)) { var association = NHibernateAssociation.FromElement(this, associate, associate, AssociationType.ManyToOne, XmlNamespace); if (association != null && !AssociationMap.ContainsKey(association.Name)) { AssociationMap.Add(association.Name, association); } } var bags = EntitySource.Root.Descendants("bag", XmlNamespace); foreach (var bag in bags) { var oneToMany = bag.Descendant("one-to-many", XmlNamespace); var association = NHibernateAssociation.FromElement(this, bag, oneToMany, AssociationType.OneToMany, XmlNamespace); if (association != null && !AssociationMap.ContainsKey(association.Name)) { AssociationMap.Add(association.Name, association); } var manyToMany = bag.Descendant("many-to-many", XmlNamespace); association = NHibernateAssociation.FromElement(this, bag, manyToMany, AssociationType.ManyToMany, XmlNamespace); if (association != null && !AssociationMap.ContainsKey(association.Name)) { AssociationMap.Add(association.Name, association); } } }
public EntityBase GetEntityBaseFromColumn(ColumnSchema column) { if (MemberMap.ContainsKey(column)) { return(MemberMap[column]); } else if (AssociationMap.ContainsKey(column)) { return(AssociationMap[column]); } else { return(null); } }
/// <summary> /// Populates the Parent Associations /// </summary> private void GetParentAssociations() { if (EntitySource.IsManyToMany()) { TableAssociation association = TableAssociation.FromParentManyToMany(this); if (association != null && !AssociationMap.ContainsKey(association.AssociationKey)) { AssociationMap.Add(association.AssociationKey, association); return; } } foreach (TableKeySchema tableKeySchema in EntitySource.ForeignKeys) { TableAssociation association = TableAssociation.FromParentForeignKey(this, tableKeySchema); if (association != null && !AssociationMap.ContainsKey(association.AssociationKey)) { AssociationMap.Add(association.AssociationKey, association); } } }
/// <summary> /// Override to populate the associations from the implemented entity. /// </summary> protected override void LoadAssociations() { if (_associations == null || _associationSets == null || !_associations.Any() || !_associationSets.Any()) { return; } //<AssociationSet Name="FK__Item__Supplier__1273C1CD" Association="PetShop.Data.FK__Item__Supplier__1273C1CD"> // // <Association Name="FK__Item__Supplier__1273C1CD"> // <End Role="Supplier" Type="PetShop.Data.Supplier" Multiplicity="0..1" /> // <End Role="Item" Type="PetShop.Data.Item" Multiplicity="*" /> // <ReferentialConstraint> // <Principal Role="Supplier"> // <PropertyRef Name="SuppId" /> // </Principal> // <Dependent Role="Item"> // <PropertyRef Name="Supplier" /> // </Dependent> // </ReferentialConstraint> //</Association> // // Custom Association: // //<Association Name="InventoryCustomProperties"> // <End Type="PetShop.Data.Inventory" Role="Inventory" Multiplicity="1" /> // <End Type="PetShop.Data.CustomProperties" Role="CustomProperties" Multiplicity="1" /> //</Association> // //<NavigationProperty Name="Supplier1" Relationship="PetShop.Data.FK__Item__Supplier__1273C1CD" FromRole="Item" ToRole="Supplier" /> var relationships = (from np in EntitySource.NavigationProperties join associationSet in _associationSets on np.Relationship.ToLower().Trim() equals associationSet.Association.ToLower().Trim() join association in _associations on associationSet.Name.ToLower().Trim() equals association.Name.ToLower().Trim() select new { NavigationProperty = np, Association = association }).ToList(); foreach (var rel in relationships) { // This sucks but is there a better way to try and detect user defined association's principal role? var principalRoleName = rel.Association.ReferentialConstraint != null ? rel.Association.ReferentialConstraint.Principal.Role : rel.Association.Name.EndsWith(rel.NavigationProperty.FromRole, StringComparison.OrdinalIgnoreCase) ? rel.NavigationProperty.ToRole : rel.NavigationProperty.FromRole; var principalRole = rel.Association.Ends.FirstOrDefault(e => e.Role.Equals(principalRoleName, StringComparison.OrdinalIgnoreCase)); var dependentRole = rel.Association.Ends.FirstOrDefault(e => e != principalRole); if (principalRole == null || dependentRole == null) { continue; } IEntity principalEntity = EntityStore.Instance.GetEntity(principalRole.Type.Replace(String.Concat(Namespace, "."), "")); IEntity dependentEntity = EntityStore.Instance.GetEntity(dependentRole.Type.Replace(String.Concat(Namespace, "."), "")); if (principalEntity == null || dependentEntity == null) { continue; } // TODO: Many To Many Associations will have no properties defined (E.G., Association.Properties) because there is no intermediary entity defined in the conceptual model. IAssociation association; AssociationType type; if (String.Equals(rel.NavigationProperty.FromRole, principalRole.Role)) { if (principalRole.Multiplicity == MultiplicityConstants.ZeroToOne) { type = dependentRole.Multiplicity == MultiplicityConstants.ZeroToOne || dependentRole.Multiplicity == MultiplicityConstants.One ? AssociationType.OneToZeroOrOne : AssociationType.ZeroOrOneToMany; } else if (principalRole.Multiplicity == MultiplicityConstants.One) { type = dependentRole.Multiplicity == MultiplicityConstants.ZeroToOne ? AssociationType.OneToZeroOrOne : dependentRole.Multiplicity == MultiplicityConstants.One ? AssociationType.OneToOne : AssociationType.OneToMany; } else if (principalRole.Multiplicity == MultiplicityConstants.Many) { type = dependentRole.Multiplicity == MultiplicityConstants.ZeroToOne ? AssociationType.ManyToZeroOrOne : dependentRole.Multiplicity == MultiplicityConstants.One ? AssociationType.ManyToOne : AssociationType.ManyToMany; } else { throw new ArgumentException(String.Format("Invalid Multiplicity detected in the {0} Association.", rel.Association.Name)); } // Note: There is no second association for ManyToMany associations... association = new ConceptualAssociation(rel.Association, type, principalEntity, dependentEntity, true, Namespace); association.SetName(rel.NavigationProperty.Name); if (rel.Association.ReferentialConstraint != null) { UpdatePropertyTypesWithForeignKeys(rel.Association.ReferentialConstraint.Principal.PropertyRefs); } } else // Current Entity is the dependent entity (child). { if (dependentRole.Multiplicity == MultiplicityConstants.ZeroToOne) { type = principalRole.Multiplicity == MultiplicityConstants.ZeroToOne || principalRole.Multiplicity == MultiplicityConstants.One ? AssociationType.OneToZeroOrOne : AssociationType.ZeroOrOneToMany; } else if (dependentRole.Multiplicity == MultiplicityConstants.One) { type = principalRole.Multiplicity == MultiplicityConstants.ZeroToOne ? AssociationType.OneToZeroOrOne : principalRole.Multiplicity == MultiplicityConstants.One ? AssociationType.OneToOne : AssociationType.OneToMany; } else if (dependentRole.Multiplicity == MultiplicityConstants.Many) { type = principalRole.Multiplicity == MultiplicityConstants.ZeroToOne ? AssociationType.ManyToZeroOrOne : principalRole.Multiplicity == MultiplicityConstants.One ? AssociationType.ManyToOne : AssociationType.ManyToMany; } else { throw new ArgumentException(String.Format("Invalid Multiplicity detected in the {0} Association.", rel.Association.Name)); } // Note: There is no second association for ManyToMany associations... association = new ConceptualAssociation(rel.Association, type, dependentEntity, principalEntity, false, Namespace); association.SetName(rel.NavigationProperty.Name); if (rel.Association.ReferentialConstraint != null) { UpdatePropertyTypesWithForeignKeys(rel.Association.ReferentialConstraint.Dependent.PropertyRefs); } } if ((rel.Association.ReferentialConstraint == null || association.Properties.Count > 0) && !String.IsNullOrEmpty(association.AssociationKeyName) && !AssociationMap.ContainsKey(association.AssociationKey)) { AssociationMap.Add(association.AssociationKey, association); } } }
public EntityAssociation GetAssocitionFromColumn(ColumnSchema column) { return((AssociationMap.ContainsKey(column)) ? AssociationMap[column] : null); }