using System; using System.ComponentModel.DataAnnotations; using System.Linq; using HealthMonitor.Util.Common; using HealthMonitor.Util.Entities.Interfaces; namespace HealthMonitor.Util.Entities.Base { public abstract class EntityBase : IEntity { /// /// 获取全局(数据库内)唯一键 /// /// 需要赋予实体键的值,多个实体键赋予的值,用逗号分隔 /// public string GetUniqueKey(string? key = null) { var type = this.GetType(); if(EntityUtils.HasAutoGenerateKey(type)) { return $"{type.Name}_{Guid.NewGuid()}"; } if (!string.IsNullOrWhiteSpace(key)) AssignEntityKey(key); var propertyValues = type.GetProperties().Where(e => e.GetCustomAttributes(typeof(KeyAttribute), false).Length > 0) .Select(e => e.GetValue(this) + ""); string str = $"{type.Name}_{string.Join("_", propertyValues)}"; return str; } /// /// 获取全局(数据库内)唯一键(通过实体的主键创建,而不会创建随机键) /// /// public string GetRequiredUniqueKey() { var type = this.GetType(); var propertyValues = type.GetProperties().Where(e => e.GetCustomAttributes(typeof(KeyAttribute), false).Length > 0) .Select(e => e.GetValue(this) + "").ToList(); if (propertyValues.Count() == 0 || (propertyValues[0] + "") == "0") throw new ArgumentException($"实体{type.Name}主键无效"); string str = $"{type.Name}_{string.Join("_", propertyValues)}"; return str; } /// /// 获取主键(数据表内唯一) /// /// public string GetPrimaryKey() { var type = this.GetType(); var propertyValues = type.GetProperties().Where(e => e.GetCustomAttributes(typeof(KeyAttribute), false).Length > 0) .Select(e => e.GetValue(this) + ""); string str = string.Join("_", propertyValues); return str; } /// /// 为实体的键(标记了KeyAttribute)属性赋值 /// /// public virtual void AssignEntityKey(string key) { var type = this.GetType(); try { var properties = type.GetProperties().Where(e => e.GetCustomAttributes(typeof(KeyAttribute), false).Length > 0); if (!string.IsNullOrWhiteSpace(key)) { //为字段赋值 var values = key.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (properties.Count() == 1 || properties.Count() == values.Count()) { int i = 0; foreach (var p in properties) p.SetValue(this, values[i]); } } } catch (Exception) { } } /// /// 断言实体各个字段值符合要求 /// public void AssertValidate() { var type = this.GetType(); var properties = type.GetProperties(); var requiredProperties = properties.Where(e => e.GetCustomAttributes(typeof(RequiredAttribute), false).Length > 0).ToList(); requiredProperties.ForEach(e => { var value = e.GetValue(this); if (value == null) { //throw new ArgumentException($"字段{e.Name}值能为空"); //赋默认值 object? v = e.PropertyType.IsValueType ? Activator.CreateInstance(e.PropertyType) : string.Empty; e.SetValue(this, v); } }); var limitedProperties = properties.Where(e => e.GetCustomAttributes(typeof(StringLengthAttribute), false).Length > 0).ToList(); limitedProperties.ForEach(e => { var attr = (e.GetCustomAttributes(typeof(StringLengthAttribute), false) as StringLengthAttribute[])![0]; int max = attr.MaximumLength; int min = attr.MinimumLength; var strValue = e.GetValue(this) + ""; if (strValue.Length > max || strValue.Length < min) throw new ArgumentException($"字段{e.Name}值长度大于{max},或者小于{min}"); }); } } }