예제 #1
0
        /// <summary>
        /// 根据关联属性获取相应的实体关系。
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        public static RelationshipMetadata GetRelationship(IProperty property)
        {
            var relProperty = property.As <RelationProperty>();

            Guard.Argument(relProperty != null, nameof(property), SR.GetString(SRKind.NotRelationProperty));

            var relations = GetAssemblyRelationships(relProperty.EntityType.Assembly);

            RelationshipMetadata metadta = null;

            switch (relProperty.RelationPropertyType)
            {
            case RelationPropertyType.EntitySet:
                metadta = CheckSetKey(relations, relProperty);
                break;

            case RelationPropertyType.RefProperty:
            case RelationPropertyType.Entity:
                metadta = CheckSingleKey(relations, relProperty);
                break;
            }

            if (metadta == null)
            {
                metadta = GetMetadataByRule(relProperty);
            }

            if (metadta == null)
            {
                throw new RelationshipException(SR.GetString(SRKind.NotDefinedRelationship));
            }

            return(metadta);
        }
예제 #2
0
        private EmitHelper RegisterProperty(DynamicFieldBuilder fieldBuilder, EmitHelper emiter, IProperty property)
        {
            var local = emiter.DeclareLocal(property.GetType());

            return(emiter
                   .ldtoken(InnerBuilder.UnderlyingSystemType)
                   .call(TypeGetTypeFromHandle)
                   .ldstr($"{assemblyBuilder.AssemblyName}-{TypeName}:{property.Name}")
                   .call(GetPropertyMethod)
                   .stloc(local)
                   .Assert(
                       property is IPropertyReference,
                       e =>
            {
                var p = property.As <IPropertyReference>().Reference;
                var dynamicFieldBuilder = fields.FirstOrDefault(s => s.FieldName == GetFieldName(p));
                if (dynamicFieldBuilder != null)
                {
                    var field = Properties.Contains(p) ? dynamicFieldBuilder.FieldBuilder :
                                p.EntityType.GetFields(BindingFlags.Public | BindingFlags.Static).FirstOrDefault(s => s.Name == GetFieldName(p));
                    if (field != null)
                    {
                        e.ldloc(local).ldsfld(field).call(SetReferenceMethod);
                    }
                }
            })
                   .ldloc(local)
                   .call(RegisterMethod)
                   .stsfld(fieldBuilder.FieldBuilder));
        }
예제 #3
0
        /// <summary>
        /// 将关联属性的值设为 null。
        /// </summary>
        /// <param name="property"></param>
        private bool SetNullable(IProperty property)
        {
            var relationPro = property.As <RelationProperty>();

            if (relationPro == null)
            {
                return(false);
            }

            var oldValue = CheckAndLazyPropertyValue(property);

            if (oldValue == null)
            {
                return(false);
            }

            switch (relationPro.RelationalPropertyType)
            {
            case RelationPropertyType.Entity:
                EntityUtility.SetEntityToNull(oldValue);
                break;

            case RelationPropertyType.EntitySet:
                EntityUtility.SetEntitySetToNull(oldValue);
                break;
            }

            return(true);
        }
예제 #4
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));
            }
        }
예제 #5
0
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var enumProperty = property.As <EnumProperty>();
            var value        = entity.GetValue(enumProperty.Reference);

            return(PropertyValue.IsEmpty(value) ? PropertyValue.Empty : ((Enum)value).GetDescription());
        }
예제 #6
0
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var enumProperty = property.As <EnumProperty>();
            var value        = entity.InternalGetValue(enumProperty.Reference);

            return(value.IsNullOrEmpty() ? null : PropertyValueHelper.NewValue(((Enum)value).GetDescription()));
        }
예제 #7
0
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var entityProperty = property.As <EntitySetProperty>();
            var instanceName   = GetInstanceName(entity, entityProperty.RelationType);
            var environment    = GetEnvironment(entity);

            using (var context = new InternalContext(instanceName))
            {
                context.Environment  = environment;
                context.InstanceName = instanceName;

                var    provider   = context.CreateRepositoryProvider(entityProperty.RelationType);
                var    expression = BuidRelationExpression(entity, entityProperty);
                object result     = null;
                if (expression != null)
                {
                    result = Execute(provider.Queryable, expression);
                    var querySetType = typeof(EntitySet <>).MakeGenericType(entityProperty.RelationType);
                    var list         = querySetType.New(new[] { result });

                    //设置实体集所属的实体Owner
                    list.As <IEntityRelation>(e => e.Owner = new EntityOwner(entity, property));

                    return(PropertyValueHelper.NewValue(list));
                }

                return(PropertyValueHelper.NewValue(result));
            }
        }
예제 #8
0
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var entityProperty = property.As <EntityProperty>();

            var instanceName = GetInstanceName(entity, entityProperty.RelationType);
            var environment  = GetEnvironment(entity);

            using (var context = new InternalContext(instanceName))
            {
                context.As <IEntityPersistentEnvironment>(s => s.Environment        = environment);
                context.As <IEntityPersistentInstanceContainer>(s => s.InstanceName = instanceName);

                var provider   = context.CreateRepositoryProvider(entityProperty.RelationType);
                var expression = BuidRelationExpression(entity, entityProperty);
                if (expression != null)
                {
                    var value = Execute(provider.Queryable, expression);

                    //设置实体所属的实体Owner
                    value.As <IEntityRelation>(e => e.Owner = new EntityOwner(entity, property));

                    return(value == null ? PropertyValue.Empty : PropertyValue.NewValue(value));
                }

                return(PropertyValue.Empty);
            }
        }
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var referenceProperty = property.As <ReferenceProperty>();
            var instanceName      = entity.GetInstanceName();
            var environment       = entity.GetEnvironment();

            var identifier = ContextInstanceManager.TryGet(instanceName);

            if (identifier == null || CheckWithoutLoading(identifier))
            {
                return(PropertyValue.Empty);
            }

            var contextProvider = identifier.Provider.GetService <IContextProvider>();

            using var scope   = identifier.ServiceProvider.TryCreateScope();
            using var service = contextProvider.CreateContextService(new ContextServiceContext(scope?.ServiceProvider ?? identifier.ServiceProvider, identifier));
            service.InitializeEnvironment(environment).InitializeInstanceName(instanceName);

            var repProvider = service.CreateRepositoryProvider(referenceProperty.RelationalType);
            var expression  = BuidRelationExpression(entity, referenceProperty);

            if (expression != null)
            {
                var value = Execute(repProvider.Queryable, expression);
                return(value == null ? PropertyValue.Empty : PropertyValue.NewValue(value));
            }

            return(PropertyValue.Empty);
        }
예제 #10
0
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var entityProperty = property.As <EntityProperty>();

            var instanceName = entity.GetInstanceName();
            var environment  = entity.GetEnvironment();

            var initContext = ContextInstanceManager.Get(instanceName);

            if (initContext == null)
            {
                return(PropertyValue.Empty);
            }

            var provider = initContext.Provider.GetService <IContextProvider>();

            using (var service = provider.CreateContextService(initContext))
            {
                service.InitializeEnvironment(environment).InitializeInstanceName(instanceName);

                var repProvider = provider.CreateRepositoryProvider(entityProperty.RelationalType, service);
                var expression  = BuidRelationExpression(entity, entityProperty);
                if (expression != null)
                {
                    var value = Execute(repProvider.Queryable, expression);

                    //设置实体所属的实体Owner
                    value.As <IEntityRelation>(e => e.Owner = new EntityOwner(entity, property));

                    return(value == null ? PropertyValue.Empty : PropertyValue.NewValue(value));
                }

                return(PropertyValue.Empty);
            }
        }
예제 #11
0
        private EmitHelper RegisterProperty(DynamicFieldBuilder fieldBuilder, EmitHelper emiter, IProperty property)
        {
            var local = emiter.DeclareLocal(property.GetType());

            var b = InnerBuilder.DefineMethod(
                "??_" + property.Name,
                typeof(IProperty), null, VisualDecoration.Private,
                CallingDecoration.Static,
#if NET35
                x =>
            {
                var @delegate = MakeLambdaExpression(property).Compile();
                if (@delegate != null)
                {
                    var bytes = @delegate.Method.GetMethodBody().GetILAsByteArray();
                    x.MethodBuilder.MethodBuilder.CreateMethodBody(bytes, bytes.Length);
                }
            });
#elif NETSTANDARD2_0
                x => { });  //todo
#else
                x => MakeLambdaExpression(property).CompileToMethod(x.MethodBuilder.MethodBuilder));
#endif

            return(emiter
                   .ldtoken(InnerBuilder.UnderlyingSystemType)
                   .call(TypeGetTypeFromHandle)
                   .call(b.MethodBuilder)
                   .stloc(local)
                   .Assert(
                       property is IPropertyReference,
                       e =>
            {
                var p = property.As <IPropertyReference>().Reference;
                var dynamicFieldBuilder = fields.FirstOrDefault(s => s.FieldName == GetFieldName(p));
                if (dynamicFieldBuilder != null)
                {
                    var field = Properties.Contains(p) ? dynamicFieldBuilder.FieldBuilder :
                                p.EntityType.GetFields(BindingFlags.Public | BindingFlags.Static).FirstOrDefault(s => s.Name == GetFieldName(p));
                    if (field != null)
                    {
                        e.ldloc(local).ldsfld(field).call(SetReferenceMethod);
                    }
                }
            })
                   .ldloc(local)
                   .call(RegisterMethod)
                   .stsfld(fieldBuilder.FieldBuilder));
        }
예제 #12
0
        /// <summary>
        /// 处理附加属性的值。
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        private PropertyValue ProcessSupposedProperty(IProperty property)
        {
            var relationProperty = property.As <RelationProperty>();

            if (relationProperty != null &&
                relationProperty.Options.LoadBehavior != LoadBehavior.None)
            {
                var value = EntityLazyloader.Load(this, relationProperty);
                lazyMgr.SetValueCreated(property.Name);
                if (value != null)
                {
                    valueEntry.Initializate(property.Name, value, () => value.Property = property);
                }

                return(value);
            }

            return(null);
        }
예제 #13
0
        /// <summary>
        /// 检查关联属性的空值,如果属性值已设置为null,则不应显示给客户端。
        /// </summary>
        /// <param name="property">要检查的属性。</param>
        /// <param name="value">属性的值。</param>
        /// <returns></returns>
        internal static PropertyValue CheckReturnValue(IProperty property, PropertyValue value)
        {
            var relationPro = property.As <RelationProperty>();

            if (relationPro == null || PropertyValue.IsEmpty(value))
            {
                return(value);
            }
            switch (relationPro.RelationalPropertyType)
            {
            case RelationPropertyType.Entity:
                return(CheckReturnEntityValue(value.GetValue().As <IEntity>(), value));

            case RelationPropertyType.EntitySet:
                return(CheckReturnEntitySetValue(value.GetValue() as IEntitySet, value));

            default:
                return(value);
            }
        }
예제 #14
0
        /// <summary>
        /// 检查关联属性的空值,如果属性值已设置为null,则不应显示给客户端。
        /// </summary>
        /// <param name="property">要检查的属性。</param>
        /// <param name="value">属性的值。</param>
        /// <returns></returns>
        internal static PropertyValue CheckReturnValue(IProperty property, PropertyValue value)
        {
            var relationPro = property.As <RelationProperty>();

            if (relationPro == null || value.IsNullOrEmpty())
            {
                return(value);
            }
            switch (relationPro.RelationPropertyType)
            {
            case RelationPropertyType.Entity:
                return(CheckReturnEntityValue(value.GetStorageValue().As <IEntity>(), value));

            case RelationPropertyType.EntitySet:
                return(CheckReturnEntitySetValue(value.GetStorageValue().As <IEntitySetInternalExtension>(), value));

            default:
                return(value);
            }
        }
예제 #15
0
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var referenceProperty = property.As <ReferenceProperty>();
            var instanceName      = GetInstanceName(entity, referenceProperty.RelationType);
            var environment       = GetEnvironment(entity);

            using (var context = new InternalContext(instanceName))
            {
                context.As <IEntityPersistentEnvironment>(s => s.Environment        = environment);
                context.As <IEntityPersistentInstanceContainer>(s => s.InstanceName = instanceName);

                var    provider   = context.CreateRepositoryProvider(referenceProperty.RelationType);
                var    expression = BuidRelationExpression(entity, referenceProperty);
                object result     = null;
                if (expression != null)
                {
                    result = Execute(provider.Queryable, expression);
                }

                return(PropertyValueHelper.NewValue(result));
            }
        }
        public override PropertyValue GetValue(IEntity entity, IProperty property)
        {
            var entityProperty = property.As <EntitySetProperty>();
            var instanceName   = entity.GetInstanceName();
            var environment    = entity.GetEnvironment();

            var identifier = ContextInstanceManager.TryGet(instanceName);

            if (identifier == null || CheckWithoutLoading(identifier))
            {
                return(PropertyValue.Empty);
            }

            var contextProvider = identifier.Provider.GetService <IContextProvider>();

            using var scope   = identifier.ServiceProvider.TryCreateScope();
            using var service = contextProvider.CreateContextService(new ContextServiceContext(scope?.ServiceProvider ?? identifier.ServiceProvider, identifier));
            service.InitializeEnvironment(environment).InitializeInstanceName(instanceName);

            var    repProvider = service.CreateRepositoryProvider(entityProperty.RelationalType);
            var    expression  = BuidRelationExpression(entity, entityProperty);
            object result      = null;

            if (expression != null)
            {
                result = Execute(repProvider.Queryable, expression);
                var querySetType = typeof(EntitySet <>).MakeGenericType(entityProperty.RelationalType);
                var list         = querySetType.New(new[] { result });

                //设置实体集所属的实体Owner
                list.As <IEntityRelation>(e => e.Owner = new EntityOwner(entity, property));

                return(PropertyValue.NewValue(list));
            }

            return(PropertyValue.Empty);
        }