private static bool CreateFKDefinition(IEnumerable <ScalarPropertyDefinition> fpk, SelfRelationTarget rt, SourceFragmentDefinition relSF, StringBuilder script, ISourceProvider provider, out FKDefinition f) { f = new FKDefinition() { cols = rt.FieldName, refCols = fpk.Select(item => item.SourceFieldExpression).ToArray(), refTbl = fpk.First().SourceFragment }; if (relSF != null) { SourceConstraint fk = relSF.Constraints.SingleOrDefault(item => item.ConstraintType == SourceConstraint.ForeignKeyConstraintTypeName && rt.FieldName.All(p => item.SourceFields.Any(pkf => pkf.SourceFieldExpression == p)) ); if (fk != null) { //if (!rt.FieldName.All(item => fk.SourceFields.Any(pkf => pkf.SourceFieldExpression == item))) // provider.GenerateDropConstraintScript(relSF, fk.ConstraintName, script); //else return(false); //f.constraintName = fk.ConstraintName; } } return(true); }
private static void GenerateRelScript(SelfRelationTarget rt, StringBuilder script, bool unicodeStrings, RelationDefinitionBase rel) { for (int i = 0; i < rt.FieldName.Length; i++) { script.Append(rt.FieldName[i]).Append(" "); if (rel is SelfRelationDefinition) { SelfRelationDefinition r = rel as SelfRelationDefinition; ScalarPropertyDefinition sp = r.Properties.Skip(i).First(); script.Append(GetType(sp.SourceField, sp.PropertyType, sp.Attributes, unicodeStrings)).Append(" NOT NULL"); } else if (rel is RelationDefinition) { LinkTarget lt = rt as LinkTarget; ScalarPropertyDefinition sp = lt.Properties.Skip(i).First(); script.Append(GetType(sp.SourceField, sp.PropertyType, sp.Attributes, unicodeStrings)).Append(" NOT NULL"); } else { throw new NotSupportedException(rel.GetType().ToString()); } } }
internal protected void FillRelations() { XmlNodeList relationNodes; #region Relations relationNodes = _ormXmlDocument.DocumentElement.SelectNodes(string.Format("{0}:EntityRelations/{0}:Relation", OrmObjectsDef.NS_PREFIX), _nsMgr); foreach (XmlNode relationNode in relationNodes) { XmlNode leftTargetNode = relationNode.SelectSingleNode(string.Format("{0}:Left", OrmObjectsDef.NS_PREFIX), _nsMgr); XmlNode rightTargetNode = relationNode.SelectSingleNode(string.Format("{0}:Right", OrmObjectsDef.NS_PREFIX), _nsMgr); XmlElement relationElement = (XmlElement)relationNode; string relationTableId = relationElement.GetAttribute("table"); string underlyingEntityId = relationElement.GetAttribute("underlyingEntity"); string disabledValue = relationElement.GetAttribute("disabled"); XmlElement leftTargetElement = (XmlElement)leftTargetNode; string leftLinkTargetEntityId = leftTargetElement.GetAttribute("entity"); XmlElement rightTargetElement = (XmlElement)rightTargetNode; string rightLinkTargetEntityId = rightTargetElement.GetAttribute("entity"); string leftFieldName = leftTargetElement.GetAttribute("fieldName"); string rightFieldName = rightTargetElement.GetAttribute("fieldName"); bool leftCascadeDelete = XmlConvert.ToBoolean(leftTargetElement.GetAttribute("cascadeDelete")); bool rightCascadeDelete = XmlConvert.ToBoolean(rightTargetElement.GetAttribute("cascadeDelete")); TableDescription relationTable = _ormObjectsDef.GetTable(relationTableId); EntityDescription underlyingEntity; if (string.IsNullOrEmpty(underlyingEntityId)) { underlyingEntity = null; } else { underlyingEntity = _ormObjectsDef.GetEntity(underlyingEntityId); } bool disabled; if (string.IsNullOrEmpty(disabledValue)) { disabled = false; } else { disabled = XmlConvert.ToBoolean(disabledValue); } EntityDescription leftLinkTargetEntity = _ormObjectsDef.GetEntity(leftLinkTargetEntityId); EntityDescription rightLinkTargetEntity = _ormObjectsDef.GetEntity(rightLinkTargetEntityId); LinkTarget leftLinkTarget = new LinkTarget(leftLinkTargetEntity, leftFieldName, leftCascadeDelete); LinkTarget rightLinkTarget = new LinkTarget(rightLinkTargetEntity, rightFieldName, rightCascadeDelete); RelationDescription relation = new RelationDescription(leftLinkTarget, rightLinkTarget, relationTable, underlyingEntity, disabled); _ormObjectsDef.Relations.Add(relation); } #endregion #region Relations relationNodes = _ormXmlDocument.DocumentElement.SelectNodes(string.Format("{0}:EntityRelations/{0}:SelfRelation", OrmObjectsDef.NS_PREFIX), _nsMgr); foreach (XmlNode relationNode in relationNodes) { XmlNode directTargetNode = relationNode.SelectSingleNode(string.Format("{0}:Direct", OrmObjectsDef.NS_PREFIX), _nsMgr); XmlNode reverseTargetNode = relationNode.SelectSingleNode(string.Format("{0}:Reverse", OrmObjectsDef.NS_PREFIX), _nsMgr); XmlElement relationElement = (XmlElement)relationNode; string relationTableId = relationElement.GetAttribute("table"); string underlyingEntityId = relationElement.GetAttribute("underlyingEntity"); string disabledValue = relationElement.GetAttribute("disabled"); string entityId = relationElement.GetAttribute("entity"); XmlElement directTargetElement = (XmlElement)directTargetNode; XmlElement reverseTargetElement = (XmlElement)reverseTargetNode; string directFieldName = directTargetElement.GetAttribute("fieldName"); string reverseFieldName = reverseTargetElement.GetAttribute("fieldName"); bool directCascadeDelete = XmlConvert.ToBoolean(directTargetElement.GetAttribute("cascadeDelete")); bool reverseCascadeDelete = XmlConvert.ToBoolean(reverseTargetElement.GetAttribute("cascadeDelete")); TableDescription relationTable = _ormObjectsDef.GetTable(relationTableId); EntityDescription underlyingEntity; if (string.IsNullOrEmpty(underlyingEntityId)) { underlyingEntity = null; } else { underlyingEntity = _ormObjectsDef.GetEntity(underlyingEntityId); } bool disabled; if (string.IsNullOrEmpty(disabledValue)) { disabled = false; } else { disabled = XmlConvert.ToBoolean(disabledValue); } EntityDescription entity = _ormObjectsDef.GetEntity(entityId); SelfRelationTarget directTarget = new SelfRelationTarget(directFieldName, directCascadeDelete); SelfRelationTarget reverseTarget = new SelfRelationTarget(reverseFieldName, reverseCascadeDelete); SelfRelationDescription relation = new SelfRelationDescription(entity, directTarget, reverseTarget, relationTable, underlyingEntity, disabled); _ormObjectsDef.SelfRelations.Add(relation); } #endregion }