Added foreignKeyFieldName for foreignKeys
Added ResolveForeignKeys to ClassActions Changed ResolveByPrimaryKey to GetByPrimaryKey Added todo's
This commit is contained in:
		
							parent
							
								
									ff6fb08a08
								
							
						
					
					
						commit
						83dc8d6045
					
				| @ -16,7 +16,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System.Attributes | ||||
|         /// <param name="dbAttributeName">Name of database-attribute (case-sensitivity is determined from database-attribute-settings) ['null' if the same as field-name]</param> | ||||
|         public DbAttribute(string attributeName = null) | ||||
|         { | ||||
|             this._attributeName = attributeName; | ||||
|             this._attributeName = attributeName;    // Todo: Automatic resolving of name if it is null (?) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Reflection; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace eu.railduction.netcore.dll.Database_Attribute_System.Attributes | ||||
| @ -10,16 +11,33 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System.Attributes | ||||
|     { | ||||
|         public Type _classType; | ||||
|         public string _attributeName; | ||||
|         public string _foreignKeyFieldName; | ||||
|         public FieldInfo _foreignKeyField; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Marks variable as foreignKey of given class | ||||
|         /// </summary> | ||||
|         /// <param name="classType">Type of class to which this is the ForeignKey</param> | ||||
|         /// <param name="dbAttributeName">Name of database-attribute (case-sensitivity is determined from database-attribute-settings) ['null' if the same as field-name]</param> | ||||
|         public DbForeignKey(Type classType, string attributeName = null) | ||||
|         /// <param name="foreignKeyFieldName">Name of foreignKey-fieldName ['null' if the same as classType-name]</param> | ||||
|         public DbForeignKey(Type classType, string foreignKeyFieldName = null, string attributeName = null) | ||||
|         { | ||||
|             this._classType = classType; | ||||
|             this._attributeName = attributeName; | ||||
|             this._attributeName = attributeName;    // Todo: Automatic resolving of name if it is null (?) | ||||
| 
 | ||||
|             bool fieldFound = false; | ||||
|             foreach (System.Reflection.FieldInfo fi in classType.GetRuntimeFields()) | ||||
|             { | ||||
|                 if(fi.Name.ToLower() == foreignKeyFieldName.ToLower()) | ||||
|                 { | ||||
|                     this._foreignKeyFieldName = fi.Name; | ||||
|                     this._foreignKeyField = fi; | ||||
| 
 | ||||
|                     fieldFound = true; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             if (!fieldFound) throw new InvalidOperationException($"Field with name='{foreignKeyFieldName}' not found in {classType.Name}."); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -18,7 +18,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System.Attributes | ||||
|         /// <param name="tableName">Name of database-table (case-sensitivity is determined from database-table-settings) ['null' if the same as class-name]</param> | ||||
|         public DbObject(string tableName = null) | ||||
|         { | ||||
|             this._tableName = tableName; | ||||
|             this._tableName = tableName;    // Todo: Automatic resolving of name if it is null (?) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -17,7 +17,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System.Attributes | ||||
|         /// <param name="dbAttributeName">Name of database-attribute (case-sensitivity is determined from database-attribute-settings) ['null' if the same as field-name]</param> | ||||
|         public DbPrimaryKey(string attributeName = null) | ||||
|         { | ||||
|             this._attributeName = attributeName; | ||||
|             this._attributeName = attributeName;    // Todo: Automatic resolving of name if it is null (?) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| using System; | ||||
| using eu.railduction.netcore.dll.Database_Attribute_System.Attributes; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
| @ -72,21 +73,21 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System | ||||
| 
 | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Resolves an object with the database<para/> | ||||
|         /// Needs to have primaryKey/s-value/s set!<para/> | ||||
|         /// - Generates an query<para/> | ||||
|         /// - Sends an query via Func<para/> | ||||
|         /// - Fills the object with data | ||||
|         /// Gets an dbObject | ||||
|         /// </summary> | ||||
|         /// <typeparam name="T"></typeparam> | ||||
|         /// <param name="classObject">Given object (marked with Db-attributes)</param> | ||||
|         /// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue]</param> | ||||
|         /// <param name="runDataLossChecks">This checks if any class-field and data-attribute does not exists in either (Slower)</param> | ||||
|         public static void ResolveByPrimaryKey<T>(T classObject, Func<string, List<Dictionary<string, object>>> queryExecutor, bool runDataLossChecks = true) | ||||
|         public static T GetByPrimaryKey<T>(Type classType, Func<string, List<Dictionary<string, object>>> queryExecutor, bool runDataLossChecks = true) where T: new() | ||||
|         { | ||||
|             string query = QueryBuilder.SelectByPrimaryKey(classObject);   // Generate query | ||||
|             T obj = new T(); | ||||
| 
 | ||||
|             string query = QueryBuilder.SelectByPrimaryKey(obj);   // Generate query | ||||
|             List<Dictionary<string, object>> dataSet = queryExecutor(query);    // Execute | ||||
|             FillObject(classObject, dataSet[0], runDataLossChecks);   // Fill the object | ||||
|             FillObject(obj, dataSet[0], runDataLossChecks);   // Fill the object | ||||
| 
 | ||||
|             return obj; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
| @ -117,5 +118,45 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System | ||||
| 
 | ||||
|             return objs;    // Return list | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Resolves all foreignKeys with the database | ||||
|         /// </summary> | ||||
|         /// <typeparam name="T"></typeparam> | ||||
|         /// <param name="classObject">Given object (marked with Db-attributes)</param> | ||||
|         /// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue]</param> | ||||
|         /// <param name="max_depth">Determents how deep resolving will be executed</param> | ||||
|         /// <param name="runDataLossChecks">This checks if any class-field and data-attribute does not exists in either (Slower)</param> | ||||
|         public static void ResolveForeignKeys<T>(T classObject, Func<string, List<Dictionary<string, object>>> queryExecutor, int max_depth = 1, bool runDataLossChecks = true) where T: new() | ||||
|         { | ||||
|             Type classType = classObject.GetType(); | ||||
| 
 | ||||
|             // Get class-fields | ||||
|             Dictionary<string, FieldInfo> dbFields = Function.ReadDbClassFields(classType); | ||||
| 
 | ||||
|             foreach (KeyValuePair<string, FieldInfo> dbField in dbFields) | ||||
|             { | ||||
|                 // If field is foreignKey | ||||
|                 if (dbField.Value.GetCustomAttribute(typeof(DbForeignKey), true) is DbForeignKey fkey) | ||||
|                 { | ||||
|                     FieldInfo f_Field = fkey._foreignKeyField; | ||||
|                     object f_value = f_Field.GetValue(classObject); | ||||
| 
 | ||||
|                     // When its empty, get it | ||||
|                     if(f_value == null) | ||||
|                     { | ||||
|                         f_value = GetByPrimaryKey<T>(classType, queryExecutor, runDataLossChecks); ; | ||||
|                     } | ||||
| 
 | ||||
|                     // Recursive resolving | ||||
|                     if (max_depth - 1 > 0) | ||||
|                     { | ||||
|                         ResolveForeignKeys(f_value, queryExecutor, max_depth - 1, runDataLossChecks); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user