Esempio n. 1
0
        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();
        }
Esempio n. 3
0
        /// <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));
                }
            }
        }
Esempio n. 4
0
        /// <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();
        }