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> |         /// <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) |         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; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
|  | using System.Reflection; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| 
 | 
 | ||||||
| namespace eu.railduction.netcore.dll.Database_Attribute_System.Attributes | 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 Type _classType; | ||||||
|         public string _attributeName; |         public string _attributeName; | ||||||
|  |         public string _foreignKeyFieldName; | ||||||
|  |         public FieldInfo _foreignKeyField; | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Marks variable as foreignKey of given class |         /// Marks variable as foreignKey of given class | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="classType">Type of class to which this is the ForeignKey</param> |         /// <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> |         /// <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._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> |         /// <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) |         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> |         /// <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) |         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.Collections.Generic; | ||||||
| using System.Reflection; | using System.Reflection; | ||||||
| using System.Text; | using System.Text; | ||||||
| @ -72,21 +73,21 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Resolves an object with the database<para/> |         /// Gets an dbObject | ||||||
|         /// Needs to have primaryKey/s-value/s set!<para/> |  | ||||||
|         /// - Generates an query<para/> |  | ||||||
|         /// - Sends an query via Func<para/> |  | ||||||
|         /// - Fills the object with data |  | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <typeparam name="T"></typeparam> |         /// <typeparam name="T"></typeparam> | ||||||
|         /// <param name="classObject">Given object (marked with Db-attributes)</param> |         /// <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="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> |         /// <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 |             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> |         /// <summary> | ||||||
| @ -117,5 +118,45 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System | |||||||
| 
 | 
 | ||||||
|             return objs;    // Return list |             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