internal static List <ForeignConstraint> GetForeignConstraints( EntityContainer container) { List <ForeignConstraint> foreignConstraintList = new List <ForeignConstraint>(); foreach (EntitySetBase baseEntitySet in container.BaseEntitySets) { AssociationSet i_fkeySet = baseEntitySet as AssociationSet; if (i_fkeySet != null) { Dictionary <string, EntitySet> dictionary = new Dictionary <string, EntitySet>(); foreach (AssociationSetEnd associationSetEnd in i_fkeySet.AssociationSetEnds) { dictionary.Add(associationSetEnd.Name, associationSetEnd.EntitySet); } foreach (ReferentialConstraint referentialConstraint in i_fkeySet.ElementType.ReferentialConstraints) { EntitySet i_parentTable = dictionary[referentialConstraint.FromRole.Name]; EntitySet i_childTable = dictionary[referentialConstraint.ToRole.Name]; ForeignConstraint foreignConstraint = new ForeignConstraint(i_fkeySet, i_parentTable, i_childTable, referentialConstraint.FromProperties, referentialConstraint.ToProperties); foreignConstraintList.Add(foreignConstraint); } } } return(foreignConstraintList); }
private bool CheckIfConstraintMappedToForeignKeyAssociation( QueryRewriter childRewriter, QueryRewriter parentRewriter, Set <Cell> cells) { ViewgenContext viewgenContext1 = childRewriter.ViewgenContext; ViewgenContext viewgenContext2 = parentRewriter.ViewgenContext; List <Set <EdmProperty> > source1 = new List <Set <EdmProperty> >(); List <Set <EdmProperty> > source2 = new List <Set <EdmProperty> >(); foreach (Cell cell in cells) { if (cell.CQuery.Extent.BuiltInTypeKind != BuiltInTypeKind.AssociationSet) { Set <EdmProperty> cslotsForTableColumns1 = cell.GetCSlotsForTableColumns(this.ChildColumns); if (cslotsForTableColumns1 != null && cslotsForTableColumns1.Count != 0) { source1.Add(cslotsForTableColumns1); } Set <EdmProperty> cslotsForTableColumns2 = cell.GetCSlotsForTableColumns(this.ParentColumns); if (cslotsForTableColumns2 != null && cslotsForTableColumns2.Count != 0) { source2.Add(cslotsForTableColumns2); } } } if (source1.Count != 0 && source2.Count != 0) { foreach (AssociationType associationType in viewgenContext1.EntityContainerMapping.EdmEntityContainer.BaseEntitySets.OfType <AssociationSet>().Where <AssociationSet>((Func <AssociationSet, bool>)(it => it.ElementType.IsForeignKey)).Select <AssociationSet, AssociationType>((Func <AssociationSet, AssociationType>)(it => it.ElementType))) { ReferentialConstraint refConstraint = associationType.ReferentialConstraints.FirstOrDefault <ReferentialConstraint>(); IEnumerable <Set <EdmProperty> > source3 = source1.Where <Set <EdmProperty> >((Func <Set <EdmProperty>, bool>)(it => it.SetEquals(new Set <EdmProperty>((IEnumerable <EdmProperty>)refConstraint.ToProperties)))); IEnumerable <Set <EdmProperty> > source4 = source2.Where <Set <EdmProperty> >((Func <Set <EdmProperty>, bool>)(it => it.SetEquals(new Set <EdmProperty>((IEnumerable <EdmProperty>)refConstraint.FromProperties)))); if (source3.Count <Set <EdmProperty> >() != 0 && source4.Count <Set <EdmProperty> >() != 0) { foreach (IEnumerable <EdmProperty> properties1_1 in source4) { Set <int> propertyIndexes = ForeignConstraint.GetPropertyIndexes(properties1_1, refConstraint.FromProperties); foreach (IEnumerable <EdmProperty> properties1_2 in source3) { if (ForeignConstraint.GetPropertyIndexes(properties1_2, refConstraint.ToProperties).SequenceEqual <int>((IEnumerable <int>)propertyIndexes)) { return(true); } } } } } } return(false); }
// effects: Given a store-side container, returns all the foreign key // constraints specified for different tables internal static List <ForeignConstraint> GetForeignConstraints(EntityContainer container) { var foreignKeyConstraints = new List <ForeignConstraint>(); // Go through all the extents and get the associations foreach (var extent in container.BaseEntitySets) { var relationSet = extent as AssociationSet; if (relationSet == null) { continue; } // Keep track of the end to EntitySet mapping var endToExtents = new Dictionary <string, EntitySet>(); foreach (var end in relationSet.AssociationSetEnds) { endToExtents.Add(end.Name, end.EntitySet); } var relationType = relationSet.ElementType; // Go through each referential constraint, determine the name // of the tables that the constraint refers to and then // create the foreign key constraint between the tables // Wow! We go to great lengths to make it cumbersome for a // programmer to deal with foreign keys foreach (var constraint in relationType.ReferentialConstraints) { // Note: We are correlating the constraint's roles with // the ends above using the role names, i.e., // FromRole.Name and ToRole.Name here and end.Role above var parentExtent = endToExtents[constraint.FromRole.Name]; var childExtent = endToExtents[constraint.ToRole.Name]; var foreignKeyConstraint = new ForeignConstraint( relationSet, parentExtent, childExtent, constraint.FromProperties, constraint.ToProperties); foreignKeyConstraints.Add(foreignKeyConstraint); } } return(foreignKeyConstraints); }
private bool CheckParentColumnsForForeignKey( Cell cell, IEnumerable <Cell> cells, AssociationEndMember parentEnd, ref List <ErrorLog.Record> errorList) { EntitySet entitySetAtEnd = MetadataHelper.GetEntitySetAtEnd((AssociationSet)cell.CQuery.Extent, parentEnd); if (ForeignConstraint.FindEntitySetForColumnsMappedToEntityKeys(cells, this.ParentColumns).Contains(entitySetAtEnd)) { return(true); } if (errorList == null) { errorList = new List <ErrorLog.Record>(); } ErrorLog.Record record = new ErrorLog.Record(ViewGenErrorCode.ForeignKeyParentTableNotMappedToEnd, Strings.ViewGen_Foreign_Key_ParentTable_NotMappedToEnd((object)this.ToUserString(), (object)this.ChildTable.Name, (object)cell.CQuery.Extent.Name, (object)parentEnd.Name, (object)this.ParentTable.Name, (object)entitySetAtEnd.Name), cell, string.Empty); errorList.Add(record); return(false); }
// effects: Given a store-side container, returns all the foreign key // constraints specified for different tables internal static List<ForeignConstraint> GetForeignConstraints(EntityContainer container) { var foreignKeyConstraints = new List<ForeignConstraint>(); // Go through all the extents and get the associations foreach (var extent in container.BaseEntitySets) { var relationSet = extent as AssociationSet; if (relationSet == null) { continue; } // Keep track of the end to EntitySet mapping var endToExtents = new Dictionary<string, EntitySet>(); foreach (var end in relationSet.AssociationSetEnds) { endToExtents.Add(end.Name, end.EntitySet); } var relationType = relationSet.ElementType; // Go through each referential constraint, determine the name // of the tables that the constraint refers to and then // create the foreign key constraint between the tables // Wow! We go to great lengths to make it cumbersome for a // programmer to deal with foreign keys foreach (var constraint in relationType.ReferentialConstraints) { // Note: We are correlating the constraint's roles with // the ends above using the role names, i.e., // FromRole.Name and ToRole.Name here and end.Role above var parentExtent = endToExtents[constraint.FromRole.Name]; var childExtent = endToExtents[constraint.ToRole.Name]; var foreignKeyConstraint = new ForeignConstraint( relationSet, parentExtent, childExtent, constraint.FromProperties, constraint.ToProperties); foreignKeyConstraints.Add(foreignKeyConstraint); } } return foreignKeyConstraints; }
private bool CheckForeignKeyColumnOrder(Set <Cell> cells, ErrorLog errorLog) { List <Cell> cellList1 = new List <Cell>(); List <Cell> cellList2 = new List <Cell>(); foreach (Cell cell in cells) { if (cell.SQuery.Extent.Equals((object)this.ChildTable)) { cellList2.Add(cell); } if (cell.SQuery.Extent.Equals((object)this.ParentTable)) { cellList1.Add(cell); } } foreach (Cell cell1 in cellList2) { List <List <int> > slotNumsForColumns1 = ForeignConstraint.GetSlotNumsForColumns(cell1, this.ChildColumns); if (slotNumsForColumns1.Count != 0) { List <MemberPath> memberPathList1 = (List <MemberPath>)null; List <MemberPath> memberPathList2 = (List <MemberPath>)null; Cell cell2 = (Cell)null; foreach (List <int> intList1 in slotNumsForColumns1) { memberPathList1 = new List <MemberPath>(intList1.Count); foreach (int slotNum in intList1) { MemberProjectedSlot memberProjectedSlot = (MemberProjectedSlot)cell1.CQuery.ProjectedSlotAt(slotNum); memberPathList1.Add(memberProjectedSlot.MemberPath); } foreach (Cell cell3 in cellList1) { List <List <int> > slotNumsForColumns2 = ForeignConstraint.GetSlotNumsForColumns(cell3, this.ParentColumns); if (slotNumsForColumns2.Count != 0) { foreach (List <int> intList2 in slotNumsForColumns2) { memberPathList2 = new List <MemberPath>(intList2.Count); foreach (int slotNum in intList2) { MemberProjectedSlot memberProjectedSlot = (MemberProjectedSlot)cell3.CQuery.ProjectedSlotAt(slotNum); memberPathList2.Add(memberProjectedSlot.MemberPath); } if (memberPathList1.Count == memberPathList2.Count) { bool flag = false; for (int index = 0; index < memberPathList1.Count && !flag; ++index) { MemberPath memberPath = memberPathList2[index]; MemberPath path1 = memberPathList1[index]; if (!memberPath.LeafEdmMember.Equals((object)path1.LeafEdmMember)) { if (memberPath.IsEquivalentViaRefConstraint(path1)) { return(true); } flag = true; } } if (!flag) { return(true); } cell2 = cell3; } } } } } ErrorLog.Record record = new ErrorLog.Record(ViewGenErrorCode.ForeignKeyColumnOrderIncorrect, Strings.ViewGen_Foreign_Key_ColumnOrder_Incorrect((object)this.ToUserString(), (object)MemberPath.PropertiesToUserString(this.ChildColumns, false), (object)this.ChildTable.Name, (object)MemberPath.PropertiesToUserString((IEnumerable <MemberPath>)memberPathList1, false), (object)cell1.CQuery.Extent.Name, (object)MemberPath.PropertiesToUserString(this.ParentColumns, false), (object)this.ParentTable.Name, (object)MemberPath.PropertiesToUserString((IEnumerable <MemberPath>)memberPathList2, false), (object)cell2.CQuery.Extent.Name), (IEnumerable <Cell>) new Cell[2] { cell2, cell1 }, string.Empty); errorLog.AddEntry(record); return(false); } } return(true); }
private void GuaranteeMappedRelationshipForForeignKey( QueryRewriter childRewriter, QueryRewriter parentRewriter, IEnumerable <Cell> cells, ErrorLog errorLog, ConfigViewGenerator config) { ViewgenContext viewgenContext1 = childRewriter.ViewgenContext; ViewgenContext viewgenContext2 = parentRewriter.ViewgenContext; IEnumerable <MemberPath> keyFields = ExtentKey.GetPrimaryKeyForEntityType(new MemberPath((EntitySetBase)this.ChildTable), this.ChildTable.ElementType).KeyFields; bool flag1 = false; bool flag2 = false; List <ErrorLog.Record> errorList = (List <ErrorLog.Record>)null; foreach (Cell cell in cells) { if (cell.SQuery.Extent.Equals((object)this.ChildTable)) { AssociationEndMember relationEndForColumns = ForeignConstraint.GetRelationEndForColumns(cell, this.ChildColumns); if (relationEndForColumns == null || this.CheckParentColumnsForForeignKey(cell, cells, relationEndForColumns, ref errorList)) { flag2 = true; if (ForeignConstraint.GetRelationEndForColumns(cell, keyFields) != null && relationEndForColumns != null && ForeignConstraint.FindEntitySetForColumnsMappedToEntityKeys(cells, keyFields).Count > 0) { flag1 = true; this.CheckConstraintWhenParentChildMapped(cell, errorLog, relationEndForColumns, config); break; } if (relationEndForColumns != null) { AssociationSet extent = (AssociationSet)cell.CQuery.Extent; MetadataHelper.GetEntitySetAtEnd(extent, relationEndForColumns); flag1 = ForeignConstraint.CheckConstraintWhenOnlyParentMapped(extent, relationEndForColumns, childRewriter, parentRewriter); if (flag1) { break; } } } } } if (!flag2) { foreach (ErrorLog.Record record in errorList) { errorLog.AddEntry(record); } } else { if (flag1) { return; } string message = Strings.ViewGen_Foreign_Key_Missing_Relationship_Mapping((object)this.ToUserString()); IEnumerable <LeftCellWrapper> wrappersFromContext1 = (IEnumerable <LeftCellWrapper>)ForeignConstraint.GetWrappersFromContext(viewgenContext2, (EntitySetBase)this.ParentTable); IEnumerable <LeftCellWrapper> wrappersFromContext2 = (IEnumerable <LeftCellWrapper>)ForeignConstraint.GetWrappersFromContext(viewgenContext1, (EntitySetBase)this.ChildTable); Set <LeftCellWrapper> set = new Set <LeftCellWrapper>(wrappersFromContext1); set.AddRange(wrappersFromContext2); ErrorLog.Record record = new ErrorLog.Record(ViewGenErrorCode.ForeignKeyMissingRelationshipMapping, message, (IEnumerable <LeftCellWrapper>)set, string.Empty); errorLog.AddEntry(record); } }