internal static void UpdateFromReference(IProperty property, IEntity entity, PropertyValue value) { var relationPro = property.As <RelationProperty>(); if (relationPro == null || PropertyValue.IsEmpty(value) || relationPro.RelationalPropertyType != RelationPropertyType.Entity) { return; } var refEntity = value.GetValue().As <IEntity>(); var relationKey = RelationshipUnity.GetRelationship(relationPro); if (relationKey == null) { return; } IEntity descEntity; IEntity sourceEntity; if (relationKey.Style == RelationshipStyle.One2Many) { descEntity = entity; sourceEntity = refEntity; } else { descEntity = refEntity; sourceEntity = entity; } foreach (var key in relationKey.Keys) { descEntity.SetValue(key.OtherProperty, sourceEntity.GetValue(key.ThisProperty)); } }
/// <summary> /// 处理关联的实体集合。 /// </summary> /// <param name="queryable"></param> /// <param name="entity"></param> /// <param name="entitySet"></param> /// <param name="property"></param> private void HandleRelationEntitySet(IQueryable queryable, IEntity entity, IEntitySet entitySet, IProperty property) { var added = entitySet.GetAttachedList(); var modified = entitySet.GetModifiedList(); var deleted = entitySet.GetDetachedList(); //处理删除的 if (deleted.Count() > 0) { queryable.BatchOperate(deleted, queryable.CreateDeleteExpression(true)); } //处理修改的 if (modified.Count() > 0) { if (entitySet.AllowBatchUpdate) { queryable.BatchOperate(modified, queryable.CreateUpdateExpression()); } else { foreach (var e in modified) { queryable.UpdateEntity(e); e.SetState(EntityState.Unchanged); HandleRelationProperties(e); } } } //处理新增的 if (added.Count() > 0) { var relation = RelationshipUnity.GetRelationship(property); added.ForEach(e => { foreach (var key in relation.Keys) { var value = entity.GetValue(key.ThisProperty); e.SetValue(key.OtherProperty, value); } }); if (entitySet.AllowBatchInsert) { queryable.BatchOperate(added, queryable.CreateInsertExpression()); } else { foreach (var e in added) { queryable.CreateEntity(e); e.SetState(EntityState.Unchanged); HandleRelationProperties(e); } } } entitySet.Reset(); }
/// <summary> /// 将实体的所有主键值赋给关联的实体属性。 /// </summary> /// <param name="entity"></param> /// <param name="relationPro"></param> /// <param name="enumerable"></param> internal static void AttachPrimaryKeyValues(IEntity entity, RelationProperty relationPro, IEnumerable enumerable) { var relationKey = RelationshipUnity.GetRelationship(relationPro); if (relationKey == null) { return; } var action = GetAttachPrimaryKeyAction(enumerable.GetType().GetEnumerableElementType()); foreach (IEntity item in enumerable) { if (item.EntityState != EntityState.Attached) { continue; } foreach (var key in relationKey.Keys) { action(item, key.OtherProperty, entity.InternalGetValue(key.ThisProperty)); } } }
/// <summary> /// 处理关联的实体集合。 /// </summary> /// <param name="queryable"></param> /// <param name="entity"></param> /// <param name="entitySet"></param> /// <param name="property"></param> private async Task HandleEntitySetPropertyAsync(IQueryable queryable, IEntity entity, IEntitySet entitySet, IProperty property, CancellationToken cancellationToken = default) { var added = entitySet.GetAttachedList(); var modified = entitySet.GetModifiedList(); var deleted = entitySet.GetDetachedList(); //处理删除的 if (deleted.Count() > 0) { await queryable.BatchOperateAsync(deleted, queryable.CreateDeleteExpression(true), cancellationToken); } //处理修改的 if (modified.Count() > 0) { if (entitySet.AllowBatchUpdate) { await queryable.BatchOperateAsync(modified, queryable.CreateUpdateExpression(), cancellationToken); } else { foreach (var e in modified) { await queryable.UpdateEntityAsync(e, cancellationToken); e.SetState(EntityState.Unchanged); await HandleRelationPropertiesAsync(e, cancellationToken); } } } //处理新增的 if (added.Count() > 0) { var relation = RelationshipUnity.GetRelationship(property); added.ForEach(e => { foreach (var key in relation.Keys) { var value = entity.GetValue(key.ThisProperty); e.SetValue(key.OtherProperty, value); } }); if (entitySet.AllowBatchInsert) { await queryable.BatchOperateAsync(added, queryable.CreateInsertExpression(), cancellationToken); } else { foreach (var e in added) { await queryable.CreateEntityAsync(e, cancellationToken); e.SetState(EntityState.Unchanged); await HandleRelationPropertiesAsync(e, cancellationToken); } } } entitySet.Reset(); }