- 修复 Aop.AuditValue 与 FreeSql.Repository 主键状态管理的冲突;

This commit is contained in:
28810
2019-08-31 03:00:17 +08:00
parent 16bd3941c5
commit baf6d768a4
14 changed files with 514 additions and 52 deletions

View File

@ -199,5 +199,152 @@
创建日期
</summary>
</member>
<member name="T:Zeus.Utility.Entity.EntityBase`1">
<summary>
实体类基类
</summary>
</member>
<member name="M:Zeus.Utility.Entity.EntityBase`1.#ctor">
<summary>
初始化一个<see cref="T:Zeus.Utility.Entity.EntityBase`1"/>类型的新实例
</summary>
</member>
<member name="P:Zeus.Utility.Entity.EntityBase`1.ID">
<summary>
获取或设置主键
</summary>
</member>
<member name="P:Zeus.Utility.Entity.EntityBase`1.CreatedAt">
<summary>
创建时间
</summary>
</member>
<member name="M:Zeus.Utility.Entity.EntityBase`1.Equals(System.Object)">
<summary>
判断两个实体是否是同一数据记录的实体
</summary>
<param name="obj">要比较的实体信息</param>
<returns></returns>
</member>
<member name="M:Zeus.Utility.Entity.EntityBase`1.IsKeyEqual(`0,`0)">
<summary>
实体Id是否相等
</summary>
</member>
<member name="M:Zeus.Utility.Entity.EntityBase`1.GetHashCode">
<summary>
用作特定类型的哈希函数
</summary>
<returns>
当前 <see cref="T:System.Object"/> 的哈希代码。<br/>
如果<c>Id</c><c>null</c>则返回0
如果不为<c>null</c>则返回<c>Id</c>对应的哈希值
</returns>
</member>
<member name="T:Zeus.Utility.Entity.IEntity`1">
<summary>
数据模型接口
</summary>
</member>
<member name="P:Zeus.Utility.Entity.IEntity`1.ID">
<summary>
实体唯一标识,主键
</summary>
</member>
<member name="P:Zeus.Utility.Entity.IEntity`1.CreatedAt">
<summary>
创建时间
</summary>
</member>
<member name="T:Zeus.Domain.Enum.IdentityType">
<summary>
登录类型
</summary>
</member>
<member name="T:Zeus.SystemUser">
<summary>
用户表
</summary>
</member>
<member name="P:Zeus.SystemUser.DisplayName">
<summary>
显示名称
</summary>
</member>
<member name="P:Zeus.SystemUser.RealName">
<summary>
真实名称
</summary>
</member>
<member name="P:Zeus.SystemUser.Gender">
<summary>
性别
</summary>
</member>
<member name="P:Zeus.SystemUser.Birthday">
<summary>
生日
</summary>
</member>
<member name="P:Zeus.SystemUser.AvaterURL">
<summary>
头像URL地址
</summary>
</member>
<member name="P:Zeus.SystemUser.Remark">
<summary>
备注
</summary>
</member>
<member name="P:Zeus.SystemUser.IsEnabled">
<summary>
启用标志
</summary>
</member>
<member name="P:Zeus.SystemUser.IsDeleted">
<summary>
删除标志
</summary>
</member>
<member name="P:Zeus.SystemUser.SystemUserAuthentication_List">
<summary>
所属用户认证记录
</summary>
</member>
<member name="T:Zeus.SystemUserAuthentication">
<summary>
用户认证表
</summary>
</member>
<member name="P:Zeus.SystemUserAuthentication.SystemUserID">
<summary>
用户表ID
</summary>
</member>
<member name="P:Zeus.SystemUserAuthentication.SystemUser">
<summary>
用户
</summary>
</member>
<member name="P:Zeus.SystemUserAuthentication.IdentityType">
<summary>
登录类型
</summary>
</member>
<member name="P:Zeus.SystemUserAuthentication.Identifier">
<summary>
登录标识
</summary>
</member>
<member name="P:Zeus.SystemUserAuthentication.Credential">
<summary>
登录凭证
</summary>
</member>
<member name="P:Zeus.SystemUserAuthentication.IsVerified">
<summary>
验证标志
</summary>
</member>
</members>
</doc>

View File

@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
namespace Zeus.Utility.Entity
{
/// <summary>
/// 实体类基类
/// </summary>
public abstract class EntityBase<TKey> : IEntity<TKey> where TKey : IEquatable<TKey>
{
/// <summary>
/// 初始化一个<see cref="EntityBase{TKey}"/>类型的新实例
/// </summary>
protected EntityBase()
{
}
/// <summary>
/// 获取或设置主键
/// </summary>
[Key]
public virtual TKey ID { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public virtual DateTime CreatedAt { get; set; } = DateTime.Now;
/// <summary>
/// 判断两个实体是否是同一数据记录的实体
/// </summary>
/// <param name="obj">要比较的实体信息</param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (!(obj is EntityBase<TKey> entity))
{
return false;
}
return IsKeyEqual(entity.ID, ID);
}
/// <summary>
/// 实体Id是否相等
/// </summary>
public static bool IsKeyEqual(TKey id1, TKey id2)
{
if (id1 == null && id2 == null)
{
return true;
}
if (id1 == null || id2 == null)
{
return false;
}
return Equals(id1, id2);
}
/// <summary>
/// 用作特定类型的哈希函数
/// </summary>
/// <returns>
/// 当前 <see cref="T:System.Object"/> 的哈希代码。<br/>
/// 如果<c>Id</c>为<c>null</c>则返回0
/// 如果不为<c>null</c>则返回<c>Id</c>对应的哈希值
/// </returns>
public override int GetHashCode()
{
if (ID == null)
{
return 0;
}
return ID.ToString().GetHashCode();
}
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Zeus.Utility.Entity
{
/// <summary>
/// 数据模型接口
/// </summary>
public interface IEntity<out TKey>
{
/// <summary>
/// 实体唯一标识,主键
/// </summary>
TKey ID { get; }
/// <summary>
/// 创建时间
/// </summary>
DateTime CreatedAt { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Zeus.Domain.Enum
{
/// <summary>
/// 登录类型
/// </summary>
public enum IdentityType
{
Account,
Email,
Mobile
}
}

View File

@ -0,0 +1,60 @@
using System;
using System.Collections.Generic;
using FreeSql.DataAnnotations;
using Zeus.Utility.Entity;
namespace Zeus
{
/// <summary>
/// 用户表
/// </summary>
[Table(Name = "system_user")]
public partial class SystemUser : EntityBase<long>
{
/// <summary>
/// 显示名称
/// </summary>
[Column(DbType = "varchar(20)", IsNullable = false, Unique = "UK_DisplayName")]
public string DisplayName { get; set; }
/// <summary>
/// 真实名称
/// </summary>
[Column(DbType = "varchar(20)")]
public string RealName { get; set; }
/// <summary>
/// 性别
/// </summary>
[Column(DbType = "varchar(2)")]
public string Gender { get; set; }
/// <summary>
/// 生日
/// </summary>
[Column(DbType = "datetime")]
public DateTime? Birthday { get; set; }
/// <summary>
/// 头像URL地址
/// </summary>
[Column(DbType = "varchar(200)")]
public string AvaterURL { get; set; }
/// <summary>
/// 备注
/// </summary>
[Column(DbType = "varchar(500)")]
public string Remark { get; set; }
/// <summary>
/// 启用标志
/// </summary>
[Column(DbType = "bit(1)", IsNullable = false)]
public bool IsEnabled { get; set; }
/// <summary>
/// 删除标志
/// </summary>
[Column(DbType = "bit(1)", IsNullable = false)]
public bool IsDeleted { get; set; }
/// <summary>
/// 所属用户认证记录
/// </summary>
[Navigate("SystemUserID")]
public ICollection<SystemUserAuthentication> SystemUserAuthentication_List { get; set; }
}
}

View File

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using FreeSql.DataAnnotations;
using Zeus.Domain.Enum;
using Zeus.Utility.Entity;
namespace Zeus
{
/// <summary>
/// 用户认证表
/// </summary>
[Table(Name = "system_user_authentication")]
public partial class SystemUserAuthentication : EntityBase<long>
{
/// <summary>
/// 用户表ID
/// </summary>
[Column(DbType = "bigint(20)", IsNullable = false)]
public long SystemUserID { get; set; }
/// <summary>
/// 用户
/// </summary>
[Navigate("SystemUserID")]
public SystemUser SystemUser { get; set; }
/// <summary>
/// 登录类型
/// </summary>
[Column(DbType = "varchar(10)", MapType = typeof(string), IsNullable = false)]
public IdentityType IdentityType { get; set; }
/// <summary>
/// 登录标识
/// </summary>
[Column(DbType = "varchar(50)", IsNullable = false, Unique = "UK_Identifier")]
public string Identifier { get; set; }
/// <summary>
/// 登录凭证
/// </summary>
[Column(DbType = "varchar(50)", IsNullable = false)]
public string Credential { get; set; }
/// <summary>
/// 验证标志
/// </summary>
[Column(DbType = "bit(1)", IsNullable = false)]
public bool IsVerified { get; set; }
}
}

View File

@ -11,6 +11,10 @@ using System.Linq.Expressions;
using System.Threading.Tasks;
using System.Collections;
using System.Diagnostics;
using Zeus;
using Zeus.Domain.Enum;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
namespace FreeSql.Tests
{
@ -345,9 +349,54 @@ namespace FreeSql.Tests
}
public static int GetUNIX_TIMESTAMP() => 0;
private List<SystemUser> GetSystemUser()
{
SystemUser user = new SystemUser
{
DisplayName = "系统管理员",
RealName = "系统管理员",
Gender = "男",
Birthday = new DateTime(1984, 7, 1),
IsEnabled = true,
IsDeleted = false,
Remark = "禁止删除",
SystemUserAuthentication_List = new List<SystemUserAuthentication>()
};
user.SystemUserAuthentication_List.Add(new SystemUserAuthentication()
{
IdentityType = IdentityType.Account,
Identifier = "admin",
Credential = "HyrPNXuCBaqZU3QIJqP9eThOHpFfm9p+",
IsVerified = true
});
user.SystemUserAuthentication_List.Add(new SystemUserAuthentication()
{
IdentityType = IdentityType.Mobile,
Identifier = "13580592001",
Credential = "HyrPNXuCBaqZU3QIJqP9eThOHpFfm9p+",
IsVerified = true
});
var users = new List<SystemUser>
{
user
};
return users;
}
[Fact]
public void Test1()
{
//g.mysql.Aop.AuditValue += (s, e) =>
//{
// if (e.Column.CsType == typeof(long)
// && e.Property.GetCustomAttribute<KeyAttribute>(false) != null
// && e.Value?.ToString() == "0")
// e.Value = new Random().Next();
//};
//g.mysql.GetRepository<SystemUser>().Insert(GetSystemUser());
g.mysql.Aop.ParseExpression += new EventHandler<Aop.ParseExpressionEventArgs>((s, e) =>
{
if (e.Expression.NodeType == ExpressionType.Call && (e.Expression as MethodCallExpression).Method.Name == "GetUNIX_TIMESTAMP")