Exemplo n.º 1
0
        private static Reference CreateReferenceFromRelationship(Relationship relationship, EntitySet entitySet)
        {
            Reference reference = new ReferenceImpl();

            reference.Name    = relationship.Name;
            reference.Entity1 = relationship.PrimaryTable.MappedEntities().FirstOrDefault();
            reference.Entity2 = relationship.ForeignTable.MappedEntities().FirstOrDefault();

            if (reference.Entity1 == null || reference.Entity2 == null)
            {
                return(null);
            }

            // Don't add a reference if an inheritance structure exists between the two entities
            if ((reference.Entity1.Parent != null && reference.Entity1.Parent == reference.Entity2) ||
                (reference.Entity2.Parent != null && reference.Entity2.Parent == reference.Entity1))
            {
                return(null);
            }
            reference.Cardinality1 = relationship.PrimaryCardinality;
            reference.Cardinality2 = relationship.ForeignCardinality;

            IList <string> existingNames1 = reference.Entity1.GetReferenceNames(reference.Entity2);
            IList <string> existingNames2 = reference.Entity2.GetReferenceNames(reference.Entity1);

            if (reference.Entity1 == reference.Entity2)
            {
                existingNames1.Add(reference.Entity1.Name);
                reference.End1Name = reference.Cardinality1 == Cardinality.Many ? reference.Entity2.Name.Pluralize().GetNextName(existingNames2) : reference.Entity2.Name.GetNextName(existingNames2);

                if (relationship.PrimaryKey.Columns.Count == 1)
                {
                    if (relationship.ForeignKey == null)
                    {
                        throw new Exception(string.Format("Relationship [{0}] on table [{1}] has no foreign key.", relationship.Name, relationship.PrimaryTable.Name));
                    }
                    else if (relationship.ForeignKey.Columns.Count != 1)
                    {
                        throw new Exception(string.Format("The foreign key [{0}] of relationship [{1}] on table [{2}] should have 1 column (to match the number of columns in the primary  key). It has {3} columns.", relationship.ForeignKey.Name, relationship.Name, relationship.PrimaryTable.Name, relationship.ForeignKey.Columns.Count));
                    }

                    reference.End2Name = relationship.ForeignKey.Columns[0].Name.GetCSharpFriendlyIdentifier().GetNextName(existingNames1);
                }
                else
                {
                    reference.End2Name = reference.Cardinality2 == Cardinality.Many ? reference.Entity1.Name.Pluralize().GetNextName(existingNames1) : reference.Entity1.Name.GetNextName(existingNames1);
                }
            }
            else
            {
                reference.End1Name = reference.Cardinality1 == Cardinality.Many ? reference.Entity2.Name.Pluralize().GetNextName(existingNames2) : reference.Entity2.Name.GetNextName(existingNames2);
                reference.End2Name = reference.Cardinality2 == Cardinality.Many ? reference.Entity1.Name.Pluralize().GetNextName(existingNames1) : reference.Entity1.Name.GetNextName(existingNames1);
            }
            reference.End1Enabled = true;
            reference.End2Enabled = true;
            reference.EntitySet   = entitySet;
            entitySet.AddReference(reference);
            reference.Entity1.AddReference(reference);

            if (reference.Entity1 != reference.Entity2)
            {
                reference.Entity2.AddReference(reference);
            }

            reference.SetMappedRelationship(relationship);

            return(reference);
        }