AggregateRootRepository

This commit is contained in:
2881099 2022-09-04 12:45:38 +08:00
parent 4b0b0da643
commit 5d12e1c436

View File

@ -69,7 +69,8 @@ namespace FreeSql
if (col.Attribute.IsVersion) continue; if (col.Attribute.IsVersion) continue;
var propvalBefore = table.GetPropertyValue(entityBefore, col.CsName); var propvalBefore = table.GetPropertyValue(entityBefore, col.CsName);
var propvalAfter = table.GetPropertyValue(entityAfter, col.CsName); var propvalAfter = table.GetPropertyValue(entityAfter, col.CsName);
if (object.Equals(propvalBefore, propvalAfter) == false) changes.Add(col.CsName); //if (object.Equals(propvalBefore, propvalAfter) == false) changes.Add(col.CsName);
if (CompareEntityPropertyValue(col.CsType, propvalBefore, propvalAfter) == false) changes.Add(col.CsName);
continue; continue;
} }
} }
@ -190,40 +191,70 @@ namespace FreeSql
if (type.IsNumberType() || if (type.IsNumberType() ||
_dicCompareEntityPropertyValue.ContainsKey(type) || _dicCompareEntityPropertyValue.ContainsKey(type) ||
type.IsEnum || type.IsEnum ||
type.NullableTypeOrThis().IsEnum || type.IsValueType ||
type.FullName.StartsWith("System.") || type.NullableTypeOrThis().IsEnum) return object.Equals(propvalBefore, propvalAfter);
type.IsValueType) return object.Equals(propvalBefore, propvalAfter);
if (propvalBefore == null && propvalAfter != null) return false; if (propvalBefore == null && propvalAfter != null) return false;
if (propvalBefore != null && propvalAfter == null) return false; if (propvalBefore != null && propvalAfter == null) return false;
if (type.IsArrayOrList())
{ if (FreeSql.Internal.Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(type)) {
var enumableBefore = propvalBefore as IEnumerable; if (type.FullName.StartsWith("Newtonsoft."))
var enumableAfter = propvalAfter as IEnumerable; return object.Equals(propvalBefore.ToString(), propvalAfter.ToString());
var itorBefore = enumableBefore.GetEnumerator();
var itorAfter = enumableAfter.GetEnumerator(); if (typeof(IDictionary).IsAssignableFrom(type))
while(true)
{ {
var moveNextBefore = itorBefore.MoveNext(); var dictBefore = (propvalBefore as IDictionary);
var moveNextAfter = itorAfter.MoveNext(); var dictAfter = (propvalAfter as IDictionary);
if (moveNextBefore != moveNextAfter) return false; if (dictBefore.Count != dictAfter.Count) return false;
if (moveNextBefore == false) return true; foreach (var key in dictBefore.Keys)
var currentBefore = itorBefore.Current; {
var currentAfter = itorAfter.Current; if (dictAfter.Contains(key) == false) return false;
if (currentBefore == null && enumableAfter == null) continue; var valBefore = dictBefore[key];
if (currentBefore == null && currentAfter != null) return false; var valAfter = dictAfter[key];
if (currentBefore != null && currentAfter == null) return false; if (valBefore == null && valAfter == null) continue;
if (CompareEntityPropertyValue(currentBefore.GetType(), currentBefore, currentAfter) == false) return false; if (valBefore == null && valAfter != null) return false;
if (valBefore != null && valAfter == null) return false;
if (CompareEntityPropertyValue(valBefore.GetType(), valBefore, valAfter) == false) return false;
}
return true;
} }
}
if (type.IsClass || type.IsInterface) if (type.IsArrayOrList())
{
foreach (var prop in type.GetProperties())
{ {
var valBefore = prop.GetValue(propvalBefore, new object[0]); var enumableBefore = propvalBefore as IEnumerable;
var valAfter = prop.GetValue(propvalAfter, new object[0]); var enumableAfter = propvalAfter as IEnumerable;
if (CompareEntityPropertyValue(prop.PropertyType, valBefore, valAfter) == false) return false; var itorBefore = enumableBefore.GetEnumerator();
var itorAfter = enumableAfter.GetEnumerator();
while (true)
{
var moveNextBefore = itorBefore.MoveNext();
var moveNextAfter = itorAfter.MoveNext();
if (moveNextBefore != moveNextAfter) return false;
if (moveNextBefore == false) break;
var currentBefore = itorBefore.Current;
var currentAfter = itorAfter.Current;
if (currentBefore == null && enumableAfter == null) continue;
if (currentBefore == null && currentAfter != null) return false;
if (currentBefore != null && currentAfter == null) return false;
if (CompareEntityPropertyValue(currentBefore.GetType(), currentBefore, currentAfter) == false) return false;
}
return true;
}
if (type.FullName.StartsWith("System.") ||
type.FullName.StartsWith("Npgsql.") ||
type.FullName.StartsWith("NetTopologySuite."))
return object.Equals(propvalBefore, propvalAfter);
if (type.IsClass)
{
foreach (var prop in type.GetProperties())
{
var valBefore = prop.GetValue(propvalBefore, new object[0]);
var valAfter = prop.GetValue(propvalAfter, new object[0]);
if (CompareEntityPropertyValue(prop.PropertyType, valBefore, valAfter) == false) return false;
}
return true;
} }
return true;
} }
return object.Equals(propvalBefore, propvalAfter); return object.Equals(propvalBefore, propvalAfter);
} }