|  | @@ -197,6 +197,18 @@ public class ScriptSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDa
 | 
	
		
			
				|  |  |      public string Description => "Custom Script";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private ScriptDocument? _scriptDocument;
 | 
	
		
			
				|  |  | +    private ScriptDocument? ScriptDocument
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        get
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if(_scriptDocument is null && Script is not null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _scriptDocument = new(Script);
 | 
	
		
			
				|  |  | +                _scriptDocument.Compile();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return _scriptDocument;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private string? _script;
 | 
	
		
			
				|  |  |      public string? Script
 | 
	
	
		
			
				|  | @@ -212,7 +224,23 @@ public class ScriptSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDa
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public IEnumerable<string> ReferencedVariables => [];
 | 
	
		
			
				|  |  | +    public IEnumerable<string> ReferencedVariables
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        get
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var method = ScriptDocument?.GetMethod(methodName: "RequiredColumns");
 | 
	
		
			
				|  |  | +            if(method is not null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var cols = Columns.None<T>();
 | 
	
		
			
				|  |  | +                method.Invoke(ScriptDocument!.GetObject(), [cols]);
 | 
	
		
			
				|  |  | +                return cols.ColumnNames().Select(x => $"{typeof(T).Name}.{x}");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return [];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public string DefaultScript()
 | 
	
		
			
				|  |  |      {
 | 
	
	
		
			
				|  | @@ -220,6 +248,11 @@ public class ScriptSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDa
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  public class Module
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    public void RequiredColumns(Columns<" + typeof(T).Name + @"> columns)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        // Modify 'columns' as required.
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      public bool Check(SaveEventDataModel<" + typeof(T).Name + @"> model)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          // Return true if model.Entity meets the requirements for this event trigger.
 | 
	
	
		
			
				|  | @@ -230,14 +263,9 @@ public class Module
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public bool Check(SaveEventDataModel<T> dataModel)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        if (Script is null) return false;
 | 
	
		
			
				|  |  | +        if (ScriptDocument is null) return false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if(_scriptDocument is null)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            _scriptDocument = new(Script);
 | 
	
		
			
				|  |  | -            _scriptDocument.Compile();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return _scriptDocument.Execute(methodname: "Check", parameters: [dataModel]);
 | 
	
		
			
				|  |  | +        return ScriptDocument.Execute(methodname: "Check", parameters: [dataModel]);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -250,6 +278,19 @@ public class ScriptSaveEventAction<T> : IEventAction<SaveEvent<T>>
 | 
	
		
			
				|  |  |      where T : Entity, new()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      private ScriptDocument? _scriptDocument;
 | 
	
		
			
				|  |  | +    private ScriptDocument? ScriptDocument
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        get
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if(_scriptDocument is null && Script is not null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _scriptDocument = new(Script);
 | 
	
		
			
				|  |  | +                _scriptDocument.SetValue("Result", null);
 | 
	
		
			
				|  |  | +                _scriptDocument.Compile();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return _scriptDocument;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private string? _script;
 | 
	
		
			
				|  |  |      public string? Script
 | 
	
	
		
			
				|  | @@ -265,7 +306,23 @@ public class ScriptSaveEventAction<T> : IEventAction<SaveEvent<T>>
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public IEnumerable<string> ReferencedVariables => [];
 | 
	
		
			
				|  |  | +    public IEnumerable<string> ReferencedVariables
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        get
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var method = ScriptDocument?.GetMethod(methodName: "RequiredColumns");
 | 
	
		
			
				|  |  | +            if(method is not null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var cols = Columns.None<T>();
 | 
	
		
			
				|  |  | +                method.Invoke(ScriptDocument!.GetObject(), [cols]);
 | 
	
		
			
				|  |  | +                return cols.ColumnNames().Select(x => $"{typeof(T).Name}.{x}");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return [];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public string Description => "Custom Script";
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -277,6 +334,11 @@ public class Module
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      public object? Result { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void RequiredColumns(Columns<" + typeof(T).Name + @"> columns)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        // Modify 'columns' as required.
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      public bool Execute(SaveEventDataModel<" + typeof(T).Name + @"> model)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          // Do anything you want with model.Entity, and then save return-value to 'Result', or leave it as 'null' if no return value is needed.
 | 
	
	
		
			
				|  | @@ -287,18 +349,12 @@ public class Module
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public object? Execute(IEventDataModel dataModel)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        if (Script is null) return null;
 | 
	
		
			
				|  |  | +        if (ScriptDocument is null) return null;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if(_scriptDocument is null)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            _scriptDocument = new(Script);
 | 
	
		
			
				|  |  | -            _scriptDocument.SetValue("Result", null);
 | 
	
		
			
				|  |  | -            _scriptDocument.Compile();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |          var model = dataModel.RootModel<SaveEventDataModel<T>>();
 | 
	
		
			
				|  |  | -        if(_scriptDocument.Execute(methodname: "Execute", parameters: [model]))
 | 
	
		
			
				|  |  | +        if(ScriptDocument.Execute(methodname: "Execute", parameters: [model]))
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return _scriptDocument.GetValue("Result");
 | 
	
		
			
				|  |  | +            return ScriptDocument.GetValue("Result");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          else
 | 
	
		
			
				|  |  |          {
 |