static CommandParameter() { configuration = EntityContextConfiguration.GetConfiguration <TEntityContext>(); KeyProperty = CommandParameterKeyProperty <TEntityContext, TEntity> .Default; TrackableProperties = CommandParameterTrackableProperties <TEntityContext, TEntity> .Default; AcceptableProperties = CommandParameterAcceptableProperties <TEntityContext, TEntity> .Default; }
static EntityDatabaseWriterInsert() { EntityContextConfiguration <TEntityContext> configuration = EntityContextConfiguration.GetConfiguration <TEntityContext>(); Type typeEntity = typeof(TEntity); PropertyInfo key = configuration.EntityKeys.GetPropEntityKey(typeEntity); #region Generate CallBackData Setter #region Expression Tree #if ET { Type typeData = EntityProxy <TEntity> .DataType; Type typeProxyData = typeof(EntityProxy <,>).MakeGenericType(new[] { typeEntity, typeData }); Type typeEntitySet = typeof(EntitySet <>).MakeGenericType(typeEntity); MethodInfo propEntitySetGetMthd = typeEntity.GetProperty("EntitySet", typeEntitySet).GetGetMethod(true); MethodInfo mthdOnPropChng = typeEntity.GetMethod("OnPropertyChanged", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(string) }, null); MethodInfo propDataGetMthd = typeEntity.GetProperty("Data", BindingFlags.NonPublic | BindingFlags.Instance).GetGetMethod(true); FieldInfo fldItem = typeProxyData.GetField("item"); ParameterExpression dr = Expression.Parameter(typeof(SqlDataReader), "dr"); ParameterExpression e = Expression.Parameter(typeof(TEntity), "e"); Expression[] expressions = new Expression[2]; //key expressions expressions[0] = Expression.Assign(Expression.Field(Expression.Field(Expression.TypeAs(Expression.Call(e, propDataGetMthd), typeProxyData), fldItem), typeData.GetField(key.Name)), Expression.Call(key.GetDataReaderGetValueMethod(), dr, Expression.Constant(0))); expressions[1] = Expression.Call(e, mthdOnPropChng, Expression.Constant(key.Name)); SetCallBackData = Expression.Lambda <Action <SqlDataReader, TEntity> >(Expression.Block(expressions), dr, e).Compile(); } #endif #endregion Expression Tree #region IL #if IL { } #endif #endregion IL #endregion Generate CallBackData Setter }
static EntityDatabaseWriterInsert() { EntityContextConfiguration <TEntityContext> configuration = EntityContextConfiguration.GetConfiguration <TEntityContext>(); Type typeEntity = typeof(TEntity); Type typeEntityCallBack = typeof(TEntityCallBack); PropertyInfo key = configuration.EntityKeys.GetPropEntityKey(typeEntity); PropertyInfo[] entityCallBackProperties = typeEntityCallBack.GetEntityAcceptableDataProperties().ToArray(); #region Generate CallBackData Setter #region Expression Tree #if ET { int counter = 0; int index = 0; int resize = 0; Type typeData = EntityProxy <TEntity> .DataType; Type typeProxyData = typeof(EntityProxy <,>).MakeGenericType(new[] { typeEntity, typeData }); Type typeEntitySet = typeof(EntitySet <>).MakeGenericType(typeEntity); MethodInfo propEntitySetGetMthd = typeEntity.GetProperty("EntitySet", typeEntitySet).GetGetMethod(true); MethodInfo mthdOnPropChng = typeEntity.GetMethod("OnPropertyChanged", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(string) }, null); MethodInfo propDataGetMthd = typeEntity.GetProperty("Data", BindingFlags.NonPublic | BindingFlags.Instance).GetGetMethod(true); FieldInfo fldItem = typeProxyData.GetField("item"); ParameterExpression dr = Expression.Parameter(typeof(SqlDataReader), "dr"); ParameterExpression e = Expression.Parameter(typeof(TEntity), "e"); Expression[] expressions = new Expression[(entityCallBackProperties.Length + 1) * 2]; //key expressions expressions[counter++] = Expression.Assign(Expression.Field(Expression.Field(Expression.TypeAs(Expression.Call(e, propDataGetMthd), typeProxyData), fldItem), typeData.GetField(key.Name)), Expression.Call(key.GetDataReaderGetValueMethod(), dr, Expression.Constant(index++))); expressions[counter++] = Expression.Call(e, mthdOnPropChng, Expression.Constant(key.Name)); foreach (PropertyInfo propCallBack in entityCallBackProperties) { PropertyInfo propEntity = typeEntity.GetProperty(propCallBack.Name); EntityRelation entityRelation = configuration.EntityRelations.GetEntityRelation(propEntity); if (entityRelation == null) { expressions[counter++] = Expression.Assign(Expression.Field(Expression.Field(Expression.TypeAs(Expression.Call(e, propDataGetMthd), typeProxyData), fldItem), typeData.GetField(propCallBack.Name)), Expression.Call(propCallBack.GetDataReaderGetValueMethod(), dr, Expression.Constant(index++))); expressions[counter++] = Expression.Call(e, mthdOnPropChng, Expression.Constant(propCallBack.Name)); } else { Type typeEditedEntity = typeof(EditedEntity <,>).MakeGenericType(typeEntity, propCallBack.PropertyType); Type typeEditedProperty = typeof(EditedProperty <>).MakeGenericType(propCallBack.PropertyType); ConstructorInfo ctrEdtdProp = typeEditedProperty.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(PropertyInfo), propCallBack.PropertyType, propCallBack.PropertyType }, null); ConstructorInfo ctrEdtdEnty = typeEditedEntity.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeEditedProperty, typeof(TrakMode) }, null); Expression expNewEdtdProp = Expression.New(ctrEdtdProp, new Expression[] { Expression.Constant(propEntity), Expression.Field(Expression.Field(Expression.TypeAs(Expression.Call(e, propDataGetMthd), typeProxyData), fldItem), typeData.GetField(propCallBack.Name)), Expression.Call(propCallBack.GetDataReaderGetValueMethod(), dr, Expression.Constant(index++)) }); Expression expNewEdtdEnty = Expression.New(ctrEdtdEnty, new Expression[] { expNewEdtdProp, Expression.Constant(TrakMode.None) }); MethodInfo mthdCallBack = typeof(EntitySet <TEntity>).GetMethod("CallBack", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(propCallBack.PropertyType); expressions[counter++] = Expression.Call(Expression.Call(e, propEntitySetGetMthd), mthdCallBack, new[] { e, expNewEdtdEnty }); resize++; } } if (resize > 0) { Array.Resize(ref expressions, expressions.Length - resize); } SetCallBackData = Expression.Lambda <Action <SqlDataReader, TEntity> >(Expression.Block(expressions), dr, e).Compile(); } #endif #endregion Expression Tree #region IL #if IL { } #endif #endregion IL #endregion Generate CallBackData Setter }