NewLife/NewLife.XCode

实体过滤器中,自动截断超长字段,主要是CreateIP/CreateUser等
大石头 编写于 2024-05-08 15:45:25
共计: 修改3个文件,增加79行、删除68行。
修改 +12 -0
修改 +62 -65
修改 +5 -3
修改 +12 -0
diff --git a/XCode/Entity/IEntityModule.cs b/XCode/Entity/IEntityModule.cs
index 3c8af2e..079d547 100644
--- a/XCode/Entity/IEntityModule.cs
+++ b/XCode/Entity/IEntityModule.cs
@@ -139,6 +139,11 @@ public class EntityModules : IEnumerable<IEntityModule>
 /// <summary>实体模块基类</summary>
 public abstract class EntityModule : IEntityModule
 {
+    #region 属性
+    /// <summary>自动清理超长字段。默认true</summary>
+    public Boolean AutoTrim { get; set; } = true;
+    #endregion
+
     #region IEntityModule 成员
     private readonly Dictionary<Type, Boolean> _Inited = new();
     /// <summary>为指定实体类初始化模块,返回是否支持</summary>
@@ -220,6 +225,7 @@ public abstract class EntityModule : IEntityModule
         // 没有这个字段,就不想了
         var fi = fields.FirstOrDefault(e => e.Name.EqualIgnoreCase(name));
         if (fi == null) return false;
+
         name = fi.Name;
         // 如果是默认值则覆盖,无视脏数据,此时很可能是新增
         if (fi.Type.IsInt())
@@ -229,6 +235,12 @@ public abstract class EntityModule : IEntityModule
         else if (fi.Type == typeof(String))
         {
             if (entity[name] is String str && !str.IsNullOrEmpty()) return false;
+
+            // 自动清理超长字段
+            if (AutoTrim && value is String str2)
+            {
+                if (fi.Length > 0 && str2.Length > fi.Length) value = str2.Substring(0, fi.Length);
+            }
         }
         else if (fi.Type == typeof(DateTime))
         {
修改 +62 -65
diff --git a/XCode/Membership/LogEntity.cs b/XCode/Membership/LogEntity.cs
index cddc5ba..b93dc0e 100644
--- a/XCode/Membership/LogEntity.cs
+++ b/XCode/Membership/LogEntity.cs
@@ -1,78 +1,75 @@
-using System;
+namespace XCode.Membership;
 
-namespace XCode.Membership
+/// <summary>日志实体类基类</summary>
+/// <typeparam name="TEntity"></typeparam>
+[Serializable]
+public class LogEntity<TEntity> : Entity<TEntity> where TEntity : LogEntity<TEntity>, new()
 {
-    /// <summary>日志实体类基类</summary>
-    /// <typeparam name="TEntity"></typeparam>
-    [Serializable]
-    public class LogEntity<TEntity> : Entity<TEntity> where TEntity : LogEntity<TEntity>, new()
+    #region 改动时写日志
+    /// <summary>添加时写日志</summary>
+    /// <returns></returns>
+    public override Int32 Insert()
     {
-        #region 改动时写日志
-        /// <summary>添加时写日志</summary>
-        /// <returns></returns>
-        public override Int32 Insert()
+        var err = "";
+        try
         {
-            var err = "";
-            try
-            {
-                return base.Insert();
-            }
-            catch (Exception ex)
-            {
-                err = ex.Message;
-                throw;
-            }
-            finally
-            {
-                LogProvider.Provider.WriteLog("添加", this, err);
-            }
+            return base.Insert();
         }
-
-        /// <summary>修改时写日志</summary>
-        /// <returns></returns>
-        public override Int32 Update()
+        catch (Exception ex)
         {
-            // 必须提前写修改日志,否则修改后脏数据失效,保存的日志为空
-            if (HasDirty) LogProvider.Provider.WriteLog("修改", this);
-
-            try
-            {
-                return base.Update();
-            }
-            catch (Exception ex)
-            {
-                LogProvider.Provider.WriteLog("修改", this, ex.Message);
-                throw;
-            }
+            err = ex.Message;
+            throw;
         }
+        finally
+        {
+            LogProvider.Provider.WriteLog("添加", this, err);
+        }
+    }
 
-        /// <summary>删除时写日志</summary>
-        /// <returns></returns>
-        public override Int32 Delete()
+    /// <summary>修改时写日志</summary>
+    /// <returns></returns>
+    public override Int32 Update()
+    {
+        // 必须提前写修改日志,否则修改后脏数据失效,保存的日志为空
+        if (HasDirty) LogProvider.Provider.WriteLog("修改", this);
+
+        try
+        {
+            return base.Update();
+        }
+        catch (Exception ex)
         {
-            var err = "";
-            try
-            {
-                return base.Delete();
-            }
-            catch (Exception ex)
-            {
-                err = ex.Message;
-                throw;
-            }
-            finally
-            {
-                LogProvider.Provider.WriteLog("删除", this, err);
-            }
+            LogProvider.Provider.WriteLog("修改", this, ex.Message);
+            throw;
         }
-        #endregion
+    }
 
-        #region 日志
-        /// <summary>写日志</summary>
-        /// <param name="action">操作</param>
-        /// <param name="success">成功</param>
-        /// <param name="remark">备注</param>
-        public static void WriteLog(String action, Boolean success, String remark) => LogProvider.Provider.WriteLog(typeof(TEntity), action, success, remark);
-        #endregion
+    /// <summary>删除时写日志</summary>
+    /// <returns></returns>
+    public override Int32 Delete()
+    {
+        var err = "";
+        try
+        {
+            return base.Delete();
+        }
+        catch (Exception ex)
+        {
+            err = ex.Message;
+            throw;
+        }
+        finally
+        {
+            LogProvider.Provider.WriteLog("删除", this, err);
+        }
     }
+    #endregion
+
+    #region 日志
+    /// <summary>写日志</summary>
+    /// <param name="action">操作</param>
+    /// <param name="success">成功</param>
+    /// <param name="remark">备注</param>
+    public static void WriteLog(String action, Boolean success, String remark) => LogProvider.Provider.WriteLog(typeof(TEntity), action, success, remark);
+    #endregion
 }
\ No newline at end of file
修改 +5 -3
diff --git a/XCode/Model/IPModule.cs b/XCode/Model/IPModule.cs
index 8aea502..c71b4c0 100644
--- a/XCode/Model/IPModule.cs
+++ b/XCode/Model/IPModule.cs
@@ -56,7 +56,9 @@ public class IPModule : EntityModule
         if (!ip.IsNullOrEmpty())
         {
             // 如果不是IPv6,去掉后面端口
-            if (ip.Contains("://")) ip = ip.Substring("://", null);
+            var p = ip.IndexOf("://");
+            if (p >= 0) ip = ip.Substring(p + 3);
+            //if (ip.Contains("://")) ip = ip.Substring("://", null);
             //if (ip.Contains(":") && !ip.Contains("::")) ip = ip.Substring(null, ":");
 
             switch (method)
@@ -65,9 +67,9 @@ public class IPModule : EntityModule
                     var fs2 = GetIPFieldNames(entity.GetType());
                     if (fs2 != null)
                     {
-                        foreach (var item in fs2)
+                        foreach (var fi in fs2)
                         {
-                            SetItem(fs2, entity, item, ip);
+                            SetItem(fs2, entity, fi, ip);
                         }
                     }
                     break;