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); } } }
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); } }
/// <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); }