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);
        }
示例#2
0
 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());
         }
     }
 }
示例#3
0
        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
        }