|
@@ -1,4 +1,5 @@
|
|
|
-using System;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using System;
|
|
|
using System.Collections;
|
|
|
using System.Collections.Concurrent;
|
|
|
using System.Collections.Generic;
|
|
@@ -49,7 +50,11 @@ namespace InABox.Core
|
|
|
}
|
|
|
public class OriginalValues : IOriginalValues
|
|
|
{
|
|
|
- private readonly ConcurrentDictionary<string, object?> Dictionary = new ConcurrentDictionary<string, object?>();
|
|
|
+ public OriginalValues()
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ public ConcurrentDictionary<string, object?> Dictionary { get; set; } = new ConcurrentDictionary<string, object?>();
|
|
|
|
|
|
public object? this[string key] { get => Dictionary[key]; set => Dictionary[key] = value; }
|
|
|
|
|
@@ -83,7 +88,7 @@ namespace InABox.Core
|
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
|
|
}
|
|
|
|
|
|
- public interface ILoadedColumns
|
|
|
+ public interface ILoadedColumns : IEnumerable<string>
|
|
|
{
|
|
|
public bool Add(string key);
|
|
|
|
|
@@ -102,6 +107,16 @@ namespace InABox.Core
|
|
|
{
|
|
|
return Columns.Contains(key);
|
|
|
}
|
|
|
+
|
|
|
+ public IEnumerator<string> GetEnumerator()
|
|
|
+ {
|
|
|
+ return Columns.GetEnumerator();
|
|
|
+ }
|
|
|
+
|
|
|
+ IEnumerator IEnumerable.GetEnumerator()
|
|
|
+ {
|
|
|
+ return Columns.GetEnumerator();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -186,9 +201,10 @@ namespace InABox.Core
|
|
|
|
|
|
private bool bChanged;
|
|
|
|
|
|
- [DoNotPersist]
|
|
|
private IOriginalValues _originalValues;
|
|
|
- public IOriginalValues OriginalValues
|
|
|
+ [DoNotPersist]
|
|
|
+ [DoNotSerialize]
|
|
|
+ public IOriginalValues OriginalValueList
|
|
|
{
|
|
|
get
|
|
|
{
|
|
@@ -197,8 +213,32 @@ namespace InABox.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [DoNotPersist]
|
|
|
+ public ConcurrentDictionary<string, object?>? OriginalValues
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ if(OriginalValueList is OriginalValues v)
|
|
|
+ {
|
|
|
+ return v.Dictionary;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ if(value != null && OriginalValueList is OriginalValues v)
|
|
|
+ {
|
|
|
+ v.Dictionary = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
[DoNotPersist]
|
|
|
[DoNotSerialize]
|
|
|
+ [JsonIgnore]
|
|
|
public ILoadedColumns LoadedColumns { get; set; }
|
|
|
|
|
|
protected virtual void SetChanged(string name, object? before, object? after)
|
|
@@ -232,7 +272,7 @@ namespace InABox.Core
|
|
|
|
|
|
private bool QueryChanged()
|
|
|
{
|
|
|
- if (OriginalValues.Any())
|
|
|
+ if (OriginalValueList.Any())
|
|
|
return true;
|
|
|
|
|
|
foreach (var oo in DatabaseSchema.GetSubObjects(this))
|
|
@@ -261,8 +301,8 @@ namespace InABox.Core
|
|
|
if (!BaseObjectExtensions.HasChanged(before, after))
|
|
|
return;
|
|
|
|
|
|
- if (!OriginalValues.ContainsKey(name))
|
|
|
- OriginalValues[name] = before;
|
|
|
+ if (!OriginalValueList.ContainsKey(name))
|
|
|
+ OriginalValueList[name] = before;
|
|
|
SetChanged(name, before, after);
|
|
|
}
|
|
|
|
|
@@ -286,7 +326,7 @@ namespace InABox.Core
|
|
|
var bObs = IsObserving();
|
|
|
SetObserving(false);
|
|
|
|
|
|
- foreach (var (key, value) in OriginalValues)
|
|
|
+ foreach (var (key, value) in OriginalValueList)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
@@ -306,7 +346,7 @@ namespace InABox.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- OriginalValues.Clear();
|
|
|
+ OriginalValueList.Clear();
|
|
|
|
|
|
|
|
|
bChanged = false;
|
|
@@ -322,7 +362,7 @@ namespace InABox.Core
|
|
|
{
|
|
|
bApplyingChanges = true;
|
|
|
|
|
|
- OriginalValues.Clear();
|
|
|
+ OriginalValueList.Clear();
|
|
|
|
|
|
bChanged = false;
|
|
|
|
|
@@ -338,7 +378,7 @@ namespace InABox.Core
|
|
|
var type = GetType();
|
|
|
try
|
|
|
{
|
|
|
- foreach (var (key, _) in OriginalValues)
|
|
|
+ foreach (var (key, _) in OriginalValueList)
|
|
|
try
|
|
|
{
|
|
|
if (UserProperties.ContainsKey(key))
|
|
@@ -451,7 +491,7 @@ namespace InABox.Core
|
|
|
prop.Setter()(Object, value);
|
|
|
if(BaseObjectExtensions.HasChanged(oldValue, value))
|
|
|
{
|
|
|
- Object.OriginalValues[prop.Name] = oldValue;
|
|
|
+ Object.OriginalValueList[prop.Name] = oldValue;
|
|
|
}
|
|
|
}
|
|
|
Object.SetObserving(bObs);
|
|
@@ -490,13 +530,13 @@ namespace InABox.Core
|
|
|
|
|
|
public static bool HasOriginalValue<T>(this T sender, string propertyname) where T : BaseObject
|
|
|
{
|
|
|
- return sender.OriginalValues != null && sender.OriginalValues.ContainsKey(propertyname);
|
|
|
+ return sender.OriginalValueList != null && sender.OriginalValueList.ContainsKey(propertyname);
|
|
|
}
|
|
|
|
|
|
public static TType GetOriginalValue<T, TType>(this T sender, string propertyname) where T : BaseObject
|
|
|
{
|
|
|
- return sender.OriginalValues != null && sender.OriginalValues.ContainsKey(propertyname)
|
|
|
- ? (TType)CoreUtils.ChangeType(sender.OriginalValues[propertyname], typeof(TType))
|
|
|
+ return sender.OriginalValueList != null && sender.OriginalValueList.ContainsKey(propertyname)
|
|
|
+ ? (TType)CoreUtils.ChangeType(sender.OriginalValueList[propertyname], typeof(TType))
|
|
|
: default;
|
|
|
}
|
|
|
|
|
@@ -534,7 +574,7 @@ namespace InABox.Core
|
|
|
{
|
|
|
var isLocal = !property.HasParentEntityLink()
|
|
|
|| (property.Parent?.HasParentEntityLink() != true && property.Name.EndsWith(".ID"));
|
|
|
- if (isLocal && sender.OriginalValues.TryGetValue(property.Name, out var value))
|
|
|
+ if (isLocal && sender.OriginalValueList.TryGetValue(property.Name, out var value))
|
|
|
{
|
|
|
result[property.Name] = value;
|
|
|
}
|
|
@@ -596,36 +636,36 @@ namespace InABox.Core
|
|
|
|
|
|
public static void SetOriginalValue<T, TType>(this T sender, string propertyname, TType value) where T : BaseObject
|
|
|
{
|
|
|
- sender.OriginalValues[propertyname] = value;
|
|
|
+ sender.OriginalValueList[propertyname] = value;
|
|
|
}
|
|
|
|
|
|
public static bool HasOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property) where T : BaseObject
|
|
|
{
|
|
|
//var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
|
|
|
String propname = CoreUtils.GetFullPropertyName(property, ".");
|
|
|
- return !String.IsNullOrWhiteSpace(propname) && sender.OriginalValues != null && sender.OriginalValues.ContainsKey(propname);
|
|
|
+ return !String.IsNullOrWhiteSpace(propname) && sender.OriginalValueList != null && sender.OriginalValueList.ContainsKey(propname);
|
|
|
}
|
|
|
|
|
|
public static TType GetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property) where T : BaseObject
|
|
|
{
|
|
|
var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
|
|
|
- return prop != null && sender.OriginalValues != null && sender.OriginalValues.ContainsKey(prop.Name)
|
|
|
- ? (TType)CoreUtils.ChangeType(sender.OriginalValues[prop.Name], typeof(TType))
|
|
|
+ return prop != null && sender.OriginalValueList != null && sender.OriginalValueList.ContainsKey(prop.Name)
|
|
|
+ ? (TType)CoreUtils.ChangeType(sender.OriginalValueList[prop.Name], typeof(TType))
|
|
|
: default;
|
|
|
}
|
|
|
|
|
|
public static TType GetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property, TType defaultValue) where T : BaseObject
|
|
|
{
|
|
|
var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
|
|
|
- return prop != null && sender.OriginalValues != null && sender.OriginalValues.ContainsKey(prop.Name)
|
|
|
- ? (TType)CoreUtils.ChangeType(sender.OriginalValues[prop.Name], typeof(TType))
|
|
|
+ return prop != null && sender.OriginalValueList != null && sender.OriginalValueList.ContainsKey(prop.Name)
|
|
|
+ ? (TType)CoreUtils.ChangeType(sender.OriginalValueList[prop.Name], typeof(TType))
|
|
|
: defaultValue;
|
|
|
}
|
|
|
|
|
|
public static void SetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property, TType value) where T : BaseObject
|
|
|
{
|
|
|
var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
|
|
|
- sender.OriginalValues[prop.Name] = value;
|
|
|
+ sender.OriginalValueList[prop.Name] = value;
|
|
|
}
|
|
|
}
|
|
|
|