private static void ProcessReference(MappingSet set, Reference reference) { // Figure out what type of reference it is, process each type differently. if (Cardinality.IsOneToMany(reference.Cardinality1, reference.Cardinality2)) { ProcessOneToManyReference(set, reference); } else if (Cardinality.IsOneToOne(reference.Cardinality1, reference.Cardinality2)) { ProcessOneToOneReference(set, reference); } else if (Cardinality.IsManyToMany(reference.Cardinality1, reference.Cardinality2)) { ProcessManyToManyReference(set, reference); } }
private void BuildCardinalityAndConformance(StringBuilder sb) { if (_cardinality != null) { string op = "="; if (_cardinality.Right != Cardinality.MANY) { var rhs = _cardinality.Right; if ((_cardinality.Left == 0) && (!_cardinality.IsZeroToZero())) { op = " < "; rhs++; //right-hand side (rhs) needs to be increment b/c we are doing a "less than", e.g. less than 2 is 0 and 1, however _cardinality.Right will be 1 } else if (_cardinality.IsZeroToZero()) { op = "="; rhs = 0; } if ((_attribute != null) && (_attribute.GetNumberOfValuesDefined() <= 1)) //1 to 1, or 0 to 1, on an attribute, just give the name, no need for count. if an attribute has more than one value then it'll be prepended with current() { //cardinality on attribute could only be 0..0, 0..1, or 1..1 if (_cardinality.Right == 1) { if (_cardinality.Left == 0) //0..1 { if (_attribute != null && _hasOptionalParentContext) { if ((_conformance == Conformance.SHOULD) || (_conformance == Conformance.MAY)) { sb.AppendFormat("not({0}{1}{2}{3}{4}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } else { sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } } else { sb.AppendFormat("not({0}{1}{5}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, Sentinels.ATTRIBUTE_IMMUTABLE_TOKEN); } } else //1..1 { sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } } else if (_cardinality.IsZeroToZero()) //0..0 { sb.AppendFormat("not({0}{1}{2}{3}{4})", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } else //unexpected cardinality, but database could have it as a bad value so output valid xpath { sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } } else { if (_cardinality.IsOneToOne() || (_cardinality.Left == 0)) { if (_outputPathOnly) { sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } else { sb.AppendFormat("count({0}{1}{2}{3}{4}){5}{6}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, op, rhs); } } else { if (_outputPathOnly) { sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } else { sb.AppendFormat("count({0}{1}{2}{3}{4})[. >= {5}] <= {6}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, _cardinality.Left, _cardinality.Right); } } } } else { if (_cardinality.IsZeroToMany()) { if (_isBranchRoot) { sb.AppendFormat("not({0}{1}{2}{3}{4}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.VALUESET_TOKEN, Sentinels.CHILDELEMENT_TOKEN); } else { sb.AppendFormat("not({0}{1}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.VALUESET_TOKEN, Sentinels.CHILDELEMENT_TOKEN); } } else { if (_cardinality.IsOneToMany()) { if (_outputPathOnly) { sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } else { sb.AppendFormat("count({0}{1}{2}{3}{4}) > 0", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } } else { if (_outputPathOnly) { sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN); } else { sb.AppendFormat("count({0}{1}{2}{3}{4}){5}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, op); } } } } if (((_conformance == Conformance.SHALL_NOT) || (_conformance == Conformance.SHOULD_NOT) || (_conformance == Conformance.MAY_NOT)) && (!_cardinality.IsZeroToMany()) && (!_cardinality.IsZeroToZero())) { sb.Insert(0, "not("); sb.Append(")"); } } }
/// <summary> /// Gets possible association tables between this entity and the supplied entity. /// </summary> /// <param name="entity1"></param> /// <param name="secondEntity"></param> /// <param name="CardinalityPrimary"></param> /// <param name="CardinalityForeign"></param> /// <returns></returns> public static ITable GetAssociationTable(this Entity entity1, Entity secondEntity, out Cardinality CardinalityPrimary, out Cardinality CardinalityForeign, out IKey mainKey, out IKey associationKey) { CardinalityPrimary = null; CardinalityForeign = null; mainKey = null; associationKey = null; ITable associationTable = null; foreach (ITable table in entity1.GetMappingSet().Database.AssociationTables()) { //ITable primaryTable = table.Relationships.FirstOrDefault(r => entity1.MappedTables().Contains(r.PrimaryTable)); bool primaryFound = false; bool foreignFound = false; #region Primary foreach (Relationship relationship in table.Relationships) { if (entity1.MappedTables().Contains(relationship.PrimaryTable)) { associationTable = table; CardinalityPrimary = relationship.ForeignKey.IsUnique ? Cardinality.One : Cardinality.Many; // relationship.PrimaryCardinality; //CardinalityForeign = relationship.ForeignCardinality; mainKey = relationship.PrimaryKey; //associationKey = relationship.ForeignKey; primaryFound = true; break; } else if (entity1.MappedTables().Contains(relationship.ForeignTable)) { associationTable = table; // relationship.ForeignTable; CardinalityPrimary = relationship.PrimaryKey.IsUnique ? Cardinality.One : Cardinality.Many; // relationship.ForeignCardinality; //CardinalityForeign = relationship.PrimaryCardinality; mainKey = relationship.ForeignKey; //associationKey = relationship.PrimaryKey; primaryFound = true; break; } } #endregion #region Foreign foreach (Relationship relationship in table.Relationships) { if (secondEntity.MappedTables().Contains(relationship.ForeignTable)) { associationTable = table; //CardinalityPrimary = relationship.PrimaryCardinality; CardinalityForeign = relationship.PrimaryKey.IsUnique ? Cardinality.One : Cardinality.Many; // relationship.ForeignCardinality; //mainKey = relationship.PrimaryKey; associationKey = relationship.ForeignKey; foreignFound = true; break; } else if (secondEntity.MappedTables().Contains(relationship.PrimaryTable)) { //associationTable = table;// relationship.ForeignTable; //CardinalityPrimary = relationship.ForeignCardinality; CardinalityForeign = relationship.ForeignKey.IsUnique ? Cardinality.One : Cardinality.Many; // relationship.PrimaryCardinality; //mainKey = relationship.ForeignKey; associationKey = relationship.PrimaryKey; foreignFound = true; break; } } #endregion if (primaryFound && foreignFound) { break; } else { associationTable = null; CardinalityPrimary = null; CardinalityForeign = null; mainKey = null; associationKey = null; } // if (entity1.MappedTables().Contains(relationship.PrimaryTable))// && // //secondEntity.MappedTables().Contains(relationship.ForeignTable)) // { // associationTable = table;// relationship.PrimaryTable; // CardinalityPrimary = relationship.PrimaryCardinality; // CardinalityForeign = relationship.ForeignCardinality; // mainKey = relationship.PrimaryKey; // associationKey = relationship.ForeignKey; // if (oneFound) // break; // else // oneFound = true; // } // else if (entity1.MappedTables().Contains(relationship.ForeignTable) && //secondEntity.MappedTables().Contains(relationship.PrimaryTable)) // { // associationTable = table;// relationship.ForeignTable; // CardinalityPrimary = relationship.ForeignCardinality; // CardinalityForeign = relationship.PrimaryCardinality; // mainKey = relationship.ForeignKey; // associationKey = relationship.PrimaryKey; // if (oneFound) // break; // else // oneFound = true; // } //} } if (associationTable != null) { return(associationTable); } ITable unpureAssociationTable = null; if (associationTable == null) { foreach (ITable table in entity1.MappedTables()) { foreach (Relationship relationship in table.Relationships) { ITable possibleAssociationTable = null; if (entity1.MappedTables().Contains(relationship.PrimaryTable) && Cardinality.IsOneToMany(relationship.ForeignCardinality, relationship.PrimaryCardinality)) { possibleAssociationTable = relationship.ForeignTable; CardinalityPrimary = relationship.PrimaryCardinality; mainKey = relationship.ForeignKey; } else if (entity1.MappedTables().Contains(relationship.ForeignTable) && Cardinality.IsOneToMany(relationship.PrimaryCardinality, relationship.ForeignCardinality)) { possibleAssociationTable = relationship.PrimaryTable; CardinalityPrimary = relationship.ForeignCardinality; mainKey = relationship.PrimaryKey; } if (possibleAssociationTable != null) { foreach (ITable otherTable in secondEntity.MappedTables()) { foreach (Relationship otherRelationship in otherTable.Relationships.Where(r => r.PrimaryTable == possibleAssociationTable || r.ForeignTable == possibleAssociationTable)) { if (otherRelationship.PrimaryTable == otherTable && Cardinality.IsOneToMany(otherRelationship.ForeignCardinality, otherRelationship.PrimaryCardinality) && possibleAssociationTable.Relationships.Where(r => r.PrimaryTable == otherRelationship.ForeignTable || r.ForeignTable == otherRelationship.ForeignTable).Count() > 0) { unpureAssociationTable = otherRelationship.ForeignTable; CardinalityForeign = otherRelationship.PrimaryCardinality; associationKey = otherRelationship.ForeignKey; return(unpureAssociationTable); } else if (otherRelationship.ForeignTable == otherTable && Cardinality.IsOneToMany(otherRelationship.PrimaryCardinality, otherRelationship.ForeignCardinality) && possibleAssociationTable.Relationships.Where(r => r.PrimaryTable == otherRelationship.PrimaryTable || r.ForeignTable == otherRelationship.PrimaryTable).Count() > 0) { unpureAssociationTable = otherRelationship.PrimaryTable; CardinalityForeign = otherRelationship.ForeignCardinality; associationKey = otherRelationship.PrimaryKey; return(unpureAssociationTable); } } } } } } } return(null); }