private static void ProcessNonIdentifyingRelations(IEntity entity, EntityInfo entityInfo) { ICollection <IRelation> dbRelations = entityInfo.Relations; foreach (IRelation relation in dbRelations) { if (relation.ReverseRelationship) { continue; } if (IsProxyObject(entity, relation)) { continue; } ICollection <IEntity> childObjects = OperationUtils.GetRelationEntities(entity, relation); if (childObjects != null) { if (relation.NonIdentifyingRelation) { foreach (RelationColumnMapping mapping in relation.TableColumnMappings) { if (entityInfo.FindRelationColumnInfo(mapping.FromField) == null) { SetParentRelationFieldsForNonIdentifyingRelations(entity, childObjects, mapping); } } } } } }
protected static ICollection <ITypeFieldValueList> GetChildEntityValueList(IEntity parentEntity, bool takeDeleted) { EntityInfo entityInfo = CacheManager.GetEntityInfo(parentEntity); ICollection <ITypeFieldValueList> existingEntityChildRelations = new List <ITypeFieldValueList>(); while (entityInfo != null) { ICollection <IRelation> typeRelations = entityInfo.Relations; foreach (IRelation typeRelation in typeRelations) { if (typeRelation.ReverseRelationship) { continue; } if (IsProxyObject(parentEntity, typeRelation)) { continue; } ICollection <IEntity> childEntities = OperationUtils.GetRelationEntities(parentEntity, typeRelation); foreach (IEntity childEntity in childEntities) { if (parentEntity.Status == EntityStatus.Deleted && typeRelation.DeleteRule == ReferentialRuleType.Cascade) { childEntity.Status = EntityStatus.Deleted; } if (childEntity.Status == EntityStatus.Deleted && !takeDeleted) { continue; } ITypeFieldValueList childKeyValueList = OperationUtils.ExtractRelationKeyValues(childEntity, typeRelation); if (childKeyValueList != null) { existingEntityChildRelations.Add(childKeyValueList); } } } entityInfo = entityInfo.SuperEntityInfo; } return(existingEntityChildRelations); }
private static void ProcessIdentifyingRelations(IEntity entity, Type type, ITransaction tx , EntityInfo entityInfo, ITypeFieldValueList fieldValues) { ICollection <IRelation> dbRelations = entityInfo.Relations; foreach (IRelation relation in dbRelations) { if (relation.ReverseRelationship || relation.NonIdentifyingRelation) { continue; } if (IsProxyObject(entity, relation)) { continue; } ICollection <IEntity> childObjects = OperationUtils.GetRelationEntities(entity, relation); if (childObjects != null) { SetRelationObjectKeyValues(fieldValues, type, relation.RelatedObjectType, childObjects, relation); foreach (IEntity fieldObject in childObjects) { IEntityFieldValueList childEntityKeyList = OperationUtils.ExtractEntityKeyValues(fieldObject); if (entity.Context.AlreadyInCurrentObjectGraph(childEntityKeyList)) { continue; } fieldObject.Context.CopyReferenceStoreFrom(entity); if (fieldObject.Status != EntityStatus.Deleted) //deleted items are already deleted { fieldObject.Persist(tx); entity.Context.AddToCurrentObjectGraphIndex(fieldObject); } } } } }