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);
                }
            }
        }
示例#3
0
 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);
                }
            }
        }
示例#6
0
 public EntityAssociation GetAssocitionFromColumn(ColumnSchema column)
 {
     return((AssociationMap.ContainsKey(column))
         ? AssociationMap[column]
         : null);
 }