/// <summary> /// Retrieves an enumerable collection of all ReferentialConstraints in this SSDL/StoreItemCollection /// </summary> /// <param name="storeItemCollection">StoreItemCollection representing the SSDL</param> /// <returns>The list of ReferentialConstraints.</returns> public static IEnumerable <ReferentialConstraint> GetAllReferentialConstraints(this StoreItemCollection storeItemCollection) { var refConstraints = new List <ReferentialConstraint>(); foreach (AssociationType association in storeItemCollection.GetAllAssociations()) { refConstraints.AddRange(association.ReferentialConstraints); } return(refConstraints); }
// TODO: in order to properly identify this we may need to add custom annotations in the SSDL /// <summary> /// We can infer that something is a join table in the SSDL if: /// 1. There are two associations originating from it /// 2. The two ends on the table are * /// 3. The other ends on the associations are 1 /// 4. The number of properties in the table is equal to the sum of all the key properties on the other ends of both associations /// 5. All properties in the table are key properties /// </summary> /// <param name="entityType">The EntityType to test.</param> /// <param name="store">The StoreItemCollection containing EntityType.</param> /// <returns>true if the specified EntityType is a join table; otherwise, false.</returns> public static bool IsJoinTable(this EntityType entityType, StoreItemCollection store) { var associations = store.GetAllAssociations().Where(a => a.IsAssociatedWithEntityType(entityType)); if (associations.Count() == 2) { var sumOfAllKeyProperties = 0; var numEndsWithOneMultiplicity = 0; foreach (AssociationType association in associations) { AssociationEndMember end1 = association.GetEnd1(); AssociationEndMember end2 = association.GetEnd2(); if ((end1.GetEntityType() == entityType) && (end1.RelationshipMultiplicity == RelationshipMultiplicity.Many) && (end2.RelationshipMultiplicity == RelationshipMultiplicity.One)) { sumOfAllKeyProperties += end2.GetEntityType().GetKeyProperties().Count(); numEndsWithOneMultiplicity++; } else if ((end2.GetEntityType() == entityType) && (end2.RelationshipMultiplicity == RelationshipMultiplicity.Many) && (end1.RelationshipMultiplicity == RelationshipMultiplicity.One)) { sumOfAllKeyProperties += end1.GetEntityType().GetKeyProperties().Count(); numEndsWithOneMultiplicity++; } } int intersectCount = entityType.GetKeyProperties().Intersect(entityType.Properties).Count(); if (numEndsWithOneMultiplicity == 2 && entityType.GetKeyProperties().Count() == sumOfAllKeyProperties && entityType.GetKeyProperties().Count() == intersectCount && entityType.Properties.Count == intersectCount) { return(true); } } return(false); }