Пример #1
0
        void MatchRelations(List <T> parents, IList childs, string relationName)
        {
            if (parents.Count == 0)
            {
                return;
            }
            if (childs.Count == 0)
            {
                return;
            }
            Class             cl = pm.GetClass(resultType);
            Relation          r  = cl.FindRelation(relationName);
            RelationCollector rc = new RelationCollector(cl);

            rc.CollectRelations();
            string[] parentColumns = rc.ForeignKeyColumns.ToArray();
            cl = pm.GetClass(r.ReferencedType);
            rc = new RelationCollector(cl);
            rc.CollectRelations();
            string[] childColumns = rc.ForeignKeyColumns.ToArray();
            // Used to determine, if the relation has been collected
            string testColumnName = r.ForeignKeyColumns.First().Name;

            if (r.Multiplicity == RelationMultiplicity.Element && parentColumns.Contains(testColumnName))
            {
                foreach (IPersistenceCapable parent in parents)
                {
                    foreach (IPersistenceCapable child in childs)
                    {
                        if (parent.NDOLoadState.LostRowsEqualsOid(child.NDOObjectId.Id, r))
                        {
                            mappings.SetRelationField(parent, r.FieldName, child);
                        }
                        //KeyValuePair kvp = ((KeyValueList)parent.NDOLoadState.LostRowInfo)[r.ForeignKeyColumnName];
                        //if (kvp.Value.Equals(child.NDOObjectId.Id.Value))
                        //    mappings.SetRelationField(parent, r.FieldName, child);
                    }
                }
            }
            else if (r.Multiplicity == RelationMultiplicity.List && childColumns.Contains(testColumnName))
            {
                foreach (IPersistenceCapable parent in parents)
                {
                    IList container = mappings.GetRelationContainer(parent, r);
                    foreach (IPersistenceCapable child in childs)
                    {
                        if (child.NDOLoadState.LostRowsEqualsOid(parent.NDOObjectId.Id, r))
                        {
                            container.Add(child);
                        }
                    }

                    parent.NDOSetLoadState(r.Ordinal, true);
                }
            }
        }
Пример #2
0
        public AssignmentGenerator(Class cls)
        {
            this.provider = cls.Provider;
            FieldMap fm = new FieldMap(cls);

            foreach (var e in fm.PersistentFields)
            {
                if (e.Value.CustomAttributes.Any(c => c.AttributeType == typeof(NDOReadOnlyAttribute)))
                {
                    continue;
                }

                var fieldMapping = cls.FindField((string)e.Key);
                if (fieldMapping != null)
                {
                    fields.Add(fieldMapping.Column.Name);
                }
            }

            var relationInfos = new RelationCollector(cls).CollectRelations().ToList();

            foreach (RelationFieldInfo ri in relationInfos)
            {
                Relation r = ri.Rel;
                if (r.Multiplicity == RelationMultiplicity.Element && r.MappingTable == null ||
                    r.Multiplicity == RelationMultiplicity.List && r.MappingTable == null && r.Parent.FullName != cls.FullName)
                {
                    foreach (ForeignKeyColumn fkColumn in r.ForeignKeyColumns)
                    {
                        fields.Add(fkColumn.Name);
                        Type systemType = fkColumn.SystemType;
                    }
                    if (r.ForeignKeyTypeColumnName != null)
                    {
                        fields.Add(r.ForeignKeyTypeColumnName);
                    }
                }
            }
            if (cls.TimeStampColumn != null)
            {
                fields.Add(cls.TimeStampColumn);
            }
        }
Пример #3
0
        /// <summary>
        /// Initializes the ColumnListGenerator
        /// </summary>
        /// <param name="cls"></param>
        public void Init(Class cls)
        {
            this.tableName  = cls.TableName;
            this.resultType = cls.SystemType;

            provider = cls.Provider;
            FieldMap      fm = new FieldMap(cls);
            var           persistentFields = fm.PersistentFields;
            var           relationInfos    = new RelationCollector(cls).CollectRelations().ToList();
            List <string> readOnlyColumns  = new List <string>();

            foreach (OidColumn oidColumn in cls.Oid.OidColumns)
            {
                hollowList.Add(oidColumn.Name);

                Relation r = oidColumn.Relation;
                if (r != null && r.ForeignKeyTypeColumnName != null)
                {
                    hollowList.Add(r.ForeignKeyTypeColumnName);                        // Die Frage ist, ob das nicht auch in der baseColumnList auftauchen muss.
                }
                if (!oidColumn.AutoIncremented && oidColumn.FieldName == null && oidColumn.RelationName == null)
                {
                    baseColumnList.Add(oidColumn.Name);
                    paramList.Add(oidColumn.Name);
                }
            }

            foreach (var e in persistentFields)
            {
                Type memberType;
                if (e.Value is FieldInfo)
                {
                    memberType = ((FieldInfo)e.Value).FieldType;
                }
                else
                {
                    memberType = ((PropertyInfo)e.Value).PropertyType;
                }

                var  fieldMapping = cls.FindField((string)e.Key);
                bool isReadOnly   = false;

                if (e.Value.CustomAttributes.Any(c => c.AttributeType == typeof(NDOReadOnlyAttribute)))
                {
                    readOnlyColumns.Add(fieldMapping.Column.Name);
                    isReadOnly = true;
                }

                // Ignore fields without mapping.
                if (null == fieldMapping)
                {
                    continue;
                }

                if (null == fieldMapping.Column.DbType)
                {
                    fieldMapping.ColumnDbType = (int)provider.GetDbType(memberType);
                }
                else
                {
                    fieldMapping.ColumnDbType = (int)provider.GetDbType(fieldMapping.Column.DbType);
                }

                if (!isReadOnly)
                {
                    baseColumnList.Add(fieldMapping.Column.Name);
                    paramList.Add(fieldMapping.Column.Name);
                }
            }

            foreach (RelationFieldInfo ri in relationInfos)
            {
                Relation r = ri.Rel;
                foreach (ForeignKeyColumn fkColumn in r.ForeignKeyColumns)
                {
                    baseColumnList.Add(fkColumn.Name);
                    paramList.Add(fkColumn.Name);
                }
                if (r.ForeignKeyTypeColumnName != null)
                {
                    baseColumnList.Add(r.ForeignKeyTypeColumnName);
                    paramList.Add(r.ForeignKeyTypeColumnName);
                }
            }

            if (cls.TimeStampColumn != null)
            {
                baseColumnList.Add(cls.TimeStampColumn);
                paramList.Add(cls.TimeStampColumn);
                hollowList.Add(cls.TimeStampColumn);
            }

            if (cls.TypeNameColumn != null)
            {
                var typeColumnName = cls.TypeNameColumn.Name;
                baseColumnList.Add(typeColumnName);
                paramList.Add(typeColumnName);
                hollowList.Add(typeColumnName);
            }

            foreach (OidColumn oidColumn in cls.Oid.OidColumns)
            {
                if (oidColumn.FieldName == null && oidColumn.RelationName == null && oidColumn.AutoIncremented)
                {
                    selectColumnList.Add(oidColumn.Name);
                }
            }

            selectColumnList.AddRange(baseColumnList);
            selectColumnList.AddRange(readOnlyColumns);
        }