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