不再支持泛型实体类,简化系统架构

This commit is contained in:
智能石头 2020-08-28 16:25:50 +08:00
parent a0c59eb9b1
commit 7e4d366359
26 changed files with 244 additions and 352 deletions

View File

@ -14,9 +14,6 @@ namespace XCode.Code
public class EntityBuilder : ClassBuilder
{
#region
/// <summary>泛型实体类。泛型参数名TEntity</summary>
public Boolean GenericType { get; set; }
/// <summary>业务类。</summary>
public Boolean Business { get; set; }
@ -32,6 +29,22 @@ namespace XCode.Code
/// <param name="connName">连接名</param>
/// <param name="chineseFileName">中文文件名</param>
public static Int32 Build(String xmlFile = null, String output = null, String nameSpace = null, String connName = null, Boolean? chineseFileName = null)
{
var option = new BuilderOption
{
Output = output,
Namespace = nameSpace,
ConnName = connName,
};
return BuildFile(xmlFile, option, chineseFileName);
}
/// <summary>为Xml模型文件生成实体类</summary>
/// <param name="xmlFile">模型文件</param>
/// <param name="option">生成可选项</param>
/// <param name="chineseFileName">中文文件名</param>
public static Int32 BuildFile(String xmlFile = null, BuilderOption option = null, Boolean? chineseFileName = null)
{
if (xmlFile.IsNullOrEmpty())
{
@ -42,14 +55,8 @@ namespace XCode.Code
xmlFile = xmlFile.GetBasePath();
if (!File.Exists(xmlFile)) throw new FileNotFoundException("指定模型文件不存在!", xmlFile);
var option = new BuilderOption
{
Output = output,
Namespace = nameSpace,
ConnName = connName,
};
// 导入模型
if (option == null) option = new BuilderOption();
var tables = LoadModels(xmlFile, option, out var atts);
if (tables.Count == 0) return 0;
@ -144,14 +151,6 @@ namespace XCode.Code
str = table.Properties["BaseClass"];
if (!str.IsNullOrEmpty()) option.BaseClass = str;
// 泛型实体类
str = table.Properties["RenderGenEntity"];
if (!str.IsNullOrEmpty()) GenericType = str.ToBoolean();
//// 名称忽略大小写(默认忽略)
//if (item.IgnoreNameCase.IsNullOrEmpty() && !ignoreNameCase) item.IgnoreNameCase = ignoreNameCase + "";
//item.Properties.Remove("NameIgnoreCase");
// 输出目录
str = table.Properties["Output"];
if (!str.IsNullOrEmpty()) option.Output = str.GetBasePath();
@ -165,57 +164,22 @@ namespace XCode.Code
// 增加常用命名空间
AddNameSpace();
if (ClassName.IsNullOrEmpty()) ClassName = (Option.Interface ? ("I" + Table.Name) : Table.Name) + Option.ClassPrefix;
if (GenericType) ClassName += "<TEntity>";
base.Execute();
}
/// <summary>实体类头部</summary>
protected override void BuildClassHeader()
{
// 泛型实体类增加默认实例
if (GenericType && Business)
{
WriteLine("/// <summary>{0}</summary>", Table.DisplayName);
WriteLine("[Serializable]");
WriteLine("[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]");
WriteLine("public class {0} : {0}<{0}> {{ }}", Table.Name);
WriteLine();
}
base.BuildClassHeader();
}
///// <summary>获取类名</summary>
///// <returns></returns>
//protected override String GetClassName()
//{
// // 类名
// var name = base.GetClassName();
// if (GenericType) name += "<TEntity>";
// return name;
//}
/// <summary>获取基类</summary>
/// <returns></returns>
protected override String GetBaseClass()
{
// 数据类的基类只有接口,业务类基类则比较复杂
if (!Business) return "I" + Table.Name;
if (!Business) return "I" + ClassName;
var name = Option.BaseClass;
if (name.IsNullOrEmpty()) name = "Entity";
if (GenericType)
name = "{0}<TEntity> where TEntity : {1}<TEntity>, new()".F(name, Table.Name);
else
name = "{0}<{1}>".F(name, Table.Name);
name = "{0}<{1}>".F(name, ClassName);
return name;
//return base.GetBaseClass();
}
/// <summary>保存</summary>
@ -501,7 +465,7 @@ namespace XCode.Code
{
var dt = Table;
WriteLine("/// <summary>{0}接口</summary>", dt.Description);
WriteLine("public partial interface I{0}", dt.Name);
WriteLine("public partial interface I{0}", ClassName);
WriteLine("{");
WriteLine("#region 属性");
@ -574,16 +538,9 @@ namespace XCode.Code
/// <summary>生成静态构造函数</summary>
protected virtual void BuildCctor()
{
WriteLine("static {0}()", Table.Name);
WriteLine("static {0}()", ClassName);
WriteLine("{");
{
if (GenericType)
{
WriteLine("// 用于引发基类的静态构造函数,所有层次的泛型实体类都应该有一个");
WriteLine("var entity = new TEntity();");
WriteLine();
}
// 第一个非自增非主键整型字段,生成累加字段代码
var dc = Table.Columns.FirstOrDefault(e => !e.Identity && !e.PrimaryKey && (e.DataType == typeof(Int32) || e.DataType == typeof(Int64)));
if (dc != null)
@ -709,7 +666,7 @@ namespace XCode.Code
/// <summary>初始化数据</summary>
protected virtual void BuildInitData()
{
var name = GenericType ? "TEntity" : Table.Name;
var name = ClassName;
WriteLine("///// <summary>首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法</summary>");
WriteLine("//[EditorBrowsable(EditorBrowsableState.Never)]");
@ -840,7 +797,7 @@ namespace XCode.Code
WriteLine("/// <summary>根据{0}查找</summary>", pk.DisplayName);
WriteLine("/// <param name=\"{0}\">{1}</param>", name, pk.DisplayName);
WriteLine("/// <returns>实体对象</returns>");
WriteLine("public static {3} FindBy{0}({1} {2})", pk.Name, pk.DataType.Name, name, GenericType ? "TEntity" : Table.Name);
WriteLine("public static {3} FindBy{0}({1} {2})", pk.Name, pk.DataType.Name, name, ClassName);
WriteLine("{");
{
if (pk.DataType.IsInt())
@ -882,7 +839,7 @@ namespace XCode.Code
}
// 返回类型
var rt = GenericType ? "TEntity" : Table.Name;
var rt = ClassName;
if (!di.Unique) rt = "IList<{0}>".F(rt);
WriteLine("/// <returns>{0}</returns>", di.Unique ? "实体对象" : "实体列表");
@ -950,7 +907,7 @@ namespace XCode.Code
}
}
var returnName = GenericType ? "TEntity" : Table.Name;
var returnName = ClassName;
WriteLine("#region 高级查询");
if (cs.Count > 0)
@ -1037,7 +994,7 @@ namespace XCode.Code
var name = dc.Name;
WriteLine();
WriteLine($"// Select Count({pname}) as {pname},{name} From {Table.Name} Where {tname}>'2020-01-24 00:00:00' Group By {name} Order By {pname} Desc limit 20");
WriteLine($"// Select Count({pname}) as {pname},{name} From {Table.TableName} Where {tname}>'2020-01-24 00:00:00' Group By {name} Order By {pname} Desc limit 20");
WriteLine($"static readonly FieldCache<{returnName}> _{name}Cache = new FieldCache<{returnName}>(nameof({name}))");
WriteLine("{");
{
@ -1056,7 +1013,7 @@ namespace XCode.Code
if (count == 0)
{
WriteLine();
WriteLine($"// Select Count({pname}) as {pname},Category From {Table.Name} Where {tname}>'2020-01-24 00:00:00' Group By Category Order By {pname} Desc limit 20");
WriteLine($"// Select Count({pname}) as {pname},Category From {Table.TableName} Where {tname}>'2020-01-24 00:00:00' Group By Category Order By {pname} Desc limit 20");
WriteLine($"//static readonly FieldCache<{returnName}> _CategoryCache = new FieldCache<{returnName}>(nameof(Category))");
WriteLine("//{");
{

View File

@ -14,7 +14,7 @@
var tables = ClassBuilder.LoadModels(null, option, out _);
// 生成实体类
EntityBuilder.Build();
EntityBuilder.BuildFile();
//EntityBuilder.BuildTables(tables, option);
// 生成简易模型类

View File

@ -74,9 +74,9 @@ namespace XCode.Membership
static ManageProvider()
{
Register<IRole>(Role.Meta.Factory);
Register<IMenu>(XCode.Membership.Menu.Meta.Factory);
Register<IMenu>(Membership.Menu.Meta.Factory);
Register<ILog>(Log.Meta.Factory);
Register<IUser>(UserX.Meta.Factory);
Register<IUser>(Membership.User.Meta.Factory);
}
/// <summary>当前管理提供者</summary>
@ -110,12 +110,12 @@ namespace XCode.Membership
/// <summary>根据用户编号查找</summary>
/// <param name="userid"></param>
/// <returns></returns>
public virtual IManageUser FindByID(Object userid) => UserX.FindByID((userid + "").ToInt(-1));
public virtual IManageUser FindByID(Object userid) => Membership.User.FindByID((userid + "").ToInt(-1));
/// <summary>根据用户帐号查找</summary>
/// <param name="name"></param>
/// <returns></returns>
public virtual IManageUser FindByName(String name) => UserX.FindByName(name);
public virtual IManageUser FindByName(String name) => Membership.User.FindByName(name);
/// <summary>登录</summary>
/// <param name="name"></param>
@ -124,7 +124,7 @@ namespace XCode.Membership
/// <returns></returns>
public virtual IManageUser Login(String name, String password, Boolean rememberme)
{
var user = UserX.Login(name, password, rememberme);
var user = Membership.User.Login(name, password, rememberme);
Current = user;
@ -146,7 +146,7 @@ namespace XCode.Membership
/// <returns></returns>
public virtual IManageUser Register(String name, String password, Int32 roleid, Boolean enable)
{
var user = new UserX
var user = new User
{
Name = name,
Password = password,

View File

@ -9,7 +9,7 @@ using NewLife.Reflection;
namespace XCode.Membership
{
/// <summary>日志提供者。提供业务日志输出到数据库的功能</summary>
public abstract class LogProvider
public class LogProvider
{
#region
/// <summary>写日志</summary>
@ -40,7 +40,45 @@ namespace XCode.Membership
/// <param name="userid">用户</param>
/// <param name="name">名称</param>
/// <param name="ip">地址</param>
public abstract void WriteLog(String category, String action, Boolean success, String remark, Int32 userid = 0, String name = null, String ip = null);
public virtual void WriteLog(String category, String action, Boolean success, String remark, Int32 userid = 0, String name = null, String ip = null)
{
if (!Enable) return;
var factory = EntityFactory.CreateOperate(typeof(Log));
var log = factory.Create() as ILog;
log.Category = category ?? throw new ArgumentNullException(nameof(category));
log.Action = action;
log.Success = success;
// 加上关联编号
if (remark.StartsWithIgnoreCase("ID="))
{
var fi = factory.Table.Identity;
if (fi != null) log.LinkID = remark.Substring("ID=", ",").ToInt();
}
if (userid > 0) log.CreateUserID = userid;
if (!name.IsNullOrEmpty()) log.UserName = name;
if (!ip.IsNullOrEmpty()) log.CreateIP = ip;
// 获取当前登录信息
if (log.CreateUserID == 0 || name.IsNullOrEmpty())
{
// 当前登录用户
var prv = Provider2 ?? ManageProvider.Provider;
//var user = prv?.Current ?? HttpContext.Current?.User?.Identity as IManageUser;
var user = prv?.Current;
if (user != null)
{
if (log.CreateUserID == 0) log.CreateUserID = user.ID;
if (log.UserName.IsNullOrEmpty()) log.UserName = user + "";
}
}
log.Remark = remark;
log.CreateTime = DateTime.Now;
log.SaveAsync();
}
/// <summary>写日志</summary>
/// <param name="type">类型</param>
@ -141,68 +179,10 @@ namespace XCode.Membership
#region
/// <summary>当前成员提供者</summary>
public static LogProvider Provider { get; set; } = new DefaultLogProvider();
#endregion
}
/// <summary>泛型日志提供者,使用泛型日志实体基类作为派生</summary>
/// <typeparam name="TLog"></typeparam>
public class LogProvider<TLog> : LogProvider where TLog : Log<TLog>, new()
{
#region
public static LogProvider Provider { get; set; } = new LogProvider();
/// <summary>当前用户提供者</summary>
public IManageProvider Provider2 { get; set; }
#endregion
/// <summary>写日志</summary>
/// <param name="category">类型</param>
/// <param name="action">操作</param>
/// <param name="success">成功</param>
/// <param name="remark">备注</param>
/// <param name="userid">用户</param>
/// <param name="name">名称</param>
/// <param name="ip">地址</param>
public override void WriteLog(String category, String action, Boolean success, String remark, Int32 userid = 0, String name = null, String ip = null)
{
if (!Enable) return;
var factory = EntityFactory.CreateOperate(typeof(TLog));
var log = factory.Create() as ILog;
log.Category = category ?? throw new ArgumentNullException(nameof(category));
log.Action = action;
log.Success = success;
// 加上关联编号
if (remark.StartsWithIgnoreCase("ID="))
{
var fi = factory.Table.Identity;
if (fi != null) log.LinkID = remark.Substring("ID=", ",").ToInt();
}
if (userid > 0) log.CreateUserID = userid;
if (!name.IsNullOrEmpty()) log.UserName = name;
if (!ip.IsNullOrEmpty()) log.CreateIP = ip;
// 获取当前登录信息
if (log.CreateUserID == 0 || name.IsNullOrEmpty())
{
// 当前登录用户
var prv = Provider2 ?? ManageProvider.Provider;
//var user = prv?.Current ?? HttpContext.Current?.User?.Identity as IManageUser;
var user = prv?.Current;
if (user != null)
{
if (log.CreateUserID == 0) log.CreateUserID = user.ID;
if (log.UserName.IsNullOrEmpty()) log.UserName = user + "";
}
}
log.Remark = remark;
log.CreateTime = DateTime.Now;
log.SaveAsync();
}
}
/// <summary>默认日志提供者,使用实体类<seealso cref="Log"/></summary>
class DefaultLogProvider : LogProvider<Log> { }
}

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Tables Version="9.19.7544.36459" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.newlifex.com http://www.newlifex.com/Model2020.xsd" NameSpace="XCode.Membership" ConnName="Membership" Output="" BaseClass="Entity" ChineseFileName="True" xmlns="http://www.newlifex.com/Model2020.xsd">
<Tables xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.newlifex.com http://www.newlifex.com/Model2020.xsd" NameSpace="XCode.Membership" ConnName="Membership" Output="" BaseClass="Entity" ChineseFileName="True" xmlns="http://www.newlifex.com/Model2020.xsd">
<Table Name="User" Description="用户" RenderGenEntity="True">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />

View File

@ -4,14 +4,26 @@ using NewLife;
namespace XCode.Membership
{
/// <summary>菜单提供者。提供菜单相关操作的功能</summary>
public abstract class MenuProvider
public class MenuProvider
{
#region
/// <summary>写日志</summary>
/// <param name="type">类型</param>
/// <param name="action">操作</param>
/// <param name="remark">备注</param>
public abstract void WriteLog(Type type, String action, String remark);
public virtual void WriteLog(Type type, String action, String remark)
{
if (!Enable) return;
if (type == null) throw new ArgumentNullException(nameof(type));
var factory = EntityFactory.CreateOperate(typeof(Menu));
var log = factory.Create() as ILog;
log.Category = type.GetDisplayName() ?? type.GetDescription() ?? type.Name;
log.Action = action;
log.Remark = remark;
log.Save();
}
/// <summary>是否使用日志</summary>
public Boolean Enable { get; set; } = true;
@ -19,33 +31,7 @@ namespace XCode.Membership
#region
/// <summary>当前成员提供者</summary>
public static MenuProvider Provider { get; set; } = new DefaultMenuProvider();
public static MenuProvider Provider { get; set; } = new MenuProvider();
#endregion
}
/// <summary>泛型菜单提供者,使用泛型菜单实体基类作为派生</summary>
/// <typeparam name="TMenu"></typeparam>
public class MenuProvider<TMenu> : MenuProvider where TMenu : Menu<TMenu>, new()
{
/// <summary>写日志</summary>
/// <param name="type">类型</param>
/// <param name="action">操作</param>
/// <param name="remark">备注</param>
public override void WriteLog(Type type, String action, String remark)
{
if (!Enable) return;
if (type == null) throw new ArgumentNullException(nameof(type));
var factory = EntityFactory.CreateOperate(typeof(TMenu));
var log = factory.Create() as ILog;
log.Category = type.GetDisplayName() ?? type.GetDescription() ?? type.Name;
log.Action = action;
log.Remark = remark;
log.Save();
}
}
/// <summary>默认菜单提供者,使用实体类<seealso cref="Menu"/></summary>
class DefaultMenuProvider : MenuProvider<Menu> { }
}

View File

@ -7,11 +7,7 @@ using XCode.Cache;
namespace XCode.Membership
{
/// <summary>日志</summary>
[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]
public class Log : Log<Log> { }
/// <summary>日志</summary>
public partial class Log<TEntity> : Entity<TEntity> where TEntity : Log<TEntity>, new()
public partial class Log : Entity<Log>
{
#region
static Log()
@ -73,7 +69,7 @@ namespace XCode.Membership
/// <param name="p"></param>
/// <returns></returns>
[Obsolete]
public static IList<TEntity> Search(String key, Int32 userid, String category, DateTime start, DateTime end, PageParameter p)
public static IList<Log> Search(String key, Int32 userid, String category, DateTime start, DateTime end, PageParameter p)
{
var exp = new WhereExpression();
//if (!key.IsNullOrEmpty()) exp &= (_.Action == key | _.Remark.Contains(key));
@ -103,7 +99,7 @@ namespace XCode.Membership
/// <param name="key"></param>
/// <param name="p"></param>
/// <returns></returns>
public static IList<TEntity> Search(String category, String action, Boolean? success, Int32 userid, DateTime start, DateTime end, String key, PageParameter p)
public static IList<Log> Search(String category, String action, Boolean? success, Int32 userid, DateTime start, DateTime end, String key, PageParameter p)
{
var exp = new WhereExpression();
@ -121,7 +117,7 @@ namespace XCode.Membership
#region
// Select Count(ID) as ID,Category From Log Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By ID Desc limit 20
static readonly FieldCache<TEntity> CategoryCache = new FieldCache<TEntity>(__.Category)
static readonly FieldCache<Log> CategoryCache = new FieldCache<Log>(__.Category)
{
Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
};
@ -130,7 +126,7 @@ namespace XCode.Membership
/// <returns></returns>
public static IDictionary<String, String> FindAllCategoryName() => CategoryCache.FindAllName();
static readonly FieldCache<TEntity> ActionCache = new FieldCache<TEntity>(__.Action)
static readonly FieldCache<Log> ActionCache = new FieldCache<Log>(__.Action)
{
Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
};

View File

@ -18,7 +18,7 @@ namespace XCode.Membership
[BindIndex("IX_Log_CreateUserID_CreateTime", false, "CreateUserID,CreateTime")]
[BindIndex("IX_Log_CreateTime", false, "CreateTime")]
[BindTable("Log", Description = "日志", ConnName = "Log", DbType = DatabaseType.None)]
public partial class Log<TEntity> : ILog
public partial class Log : ILog
{
#region
private Int32 _ID;

View File

@ -27,23 +27,20 @@ namespace XCode.Membership
}
/// <summary>管理员</summary>
[Serializable]
[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]
public class UserX : User<UserX> { }
[Obsolete("UserX=>User")]
public class UserX : User { }
/// <summary>管理员</summary>
/// <remarks>
/// 基础实体类应该是只有一个泛型参数的,需要用到别的类型时,可以继承一个,也可以通过虚拟重载等手段让基类实现
/// </remarks>
/// <typeparam name="TEntity">管理员类型</typeparam>
public abstract partial class User<TEntity> : LogEntity<TEntity>, IUser, IAuthUser, IIdentity
where TEntity : User<TEntity>, new()
public partial class User : LogEntity<User>, IUser, IAuthUser, IIdentity
{
#region
static User()
{
// 用于引发基类的静态构造函数
var entity = new TEntity();
//// 用于引发基类的静态构造函数
//var entity = new TEntity();
//!!! 曾经这里导致产生死锁
// 这里是静态构造函数访问Factory引发EntityFactory.CreateOperate
@ -67,13 +64,13 @@ namespace XCode.Membership
if (Meta.Count > 0) return;
if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}用户数据……", typeof(TEntity).Name);
if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}用户数据……", typeof(User).Name);
Add("admin", null, 1, "管理员");
//Add("poweruser", null, 2, "高级用户");
//Add("user", null, 3, "普通用户");
if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}用户数据!", typeof(TEntity).Name);
if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}用户数据!", typeof(User).Name);
}
/// <summary>验证</summary>
@ -147,7 +144,7 @@ namespace XCode.Membership
/// <summary>根据编号查找</summary>
/// <param name="id"></param>
/// <returns></returns>
public static TEntity FindByID(Int32 id)
public static User FindByID(Int32 id)
{
if (id <= 0) return null;
@ -160,20 +157,20 @@ namespace XCode.Membership
/// <summary>根据名称查找</summary>
/// <param name="name">名称</param>
/// <returns></returns>
public static TEntity FindByName(String name)
public static User FindByName(String name)
{
if (name.IsNullOrEmpty()) return null;
if (Meta.Count < 1000) return Meta.Cache.Find(e => e.Name.EqualIgnoreCase(name));
// 单对象缓存
return Meta.SingleCache.GetItemWithSlaveKey(name) as TEntity;
return Meta.SingleCache.GetItemWithSlaveKey(name) as User;
}
/// <summary>根据邮箱地址查找</summary>
/// <param name="mail"></param>
/// <returns></returns>
public static TEntity FindByMail(String mail)
public static User FindByMail(String mail)
{
if (mail.IsNullOrEmpty()) return null;
@ -185,7 +182,7 @@ namespace XCode.Membership
/// <summary>根据手机号码查找</summary>
/// <param name="mobile"></param>
/// <returns></returns>
public static TEntity FindByMobile(String mobile)
public static User FindByMobile(String mobile)
{
if (mobile.IsNullOrEmpty()) return null;
@ -197,7 +194,7 @@ namespace XCode.Membership
/// <summary>根据唯一代码查找</summary>
/// <param name="code"></param>
/// <returns></returns>
public static TEntity FindByCode(String code)
public static User FindByCode(String code)
{
if (code.IsNullOrEmpty()) return null;
@ -214,7 +211,7 @@ namespace XCode.Membership
/// <param name="isEnable"></param>
/// <param name="p"></param>
/// <returns></returns>
public static IList<TEntity> Search(String key, Int32 roleId, Boolean? isEnable, PageParameter p) => Search(key, roleId, isEnable, DateTime.MinValue, DateTime.MinValue, p);
public static IList<User> Search(String key, Int32 roleId, Boolean? isEnable, PageParameter p) => Search(key, roleId, isEnable, DateTime.MinValue, DateTime.MinValue, p);
/// <summary>高级查询</summary>
/// <param name="key"></param>
@ -224,7 +221,7 @@ namespace XCode.Membership
/// <param name="end"></param>
/// <param name="p"></param>
/// <returns></returns>
public static IList<TEntity> Search(String key, Int32 roleId, Boolean? isEnable, DateTime start, DateTime end, PageParameter p)
public static IList<User> Search(String key, Int32 roleId, Boolean? isEnable, DateTime start, DateTime end, PageParameter p)
{
var exp = _.LastLogin.Between(start, end);
if (roleId > 0) exp &= _.RoleID == roleId | _.RoleIds.Contains("," + roleId + ",");
@ -251,7 +248,7 @@ namespace XCode.Membership
/// <param name="key">关键字,搜索代码、名称、昵称、手机、邮箱</param>
/// <param name="page"></param>
/// <returns></returns>
public static IList<TEntity> Search(Int32 roleId, Int32 departmentId, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
public static IList<User> Search(Int32 roleId, Int32 departmentId, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (roleId >= 0) exp &= _.RoleID == roleId | _.RoleIds.Contains("," + roleId + ",");
@ -271,14 +268,14 @@ namespace XCode.Membership
/// <param name="roleid"></param>
/// <param name="display"></param>
/// <returns></returns>
public static TEntity Add(String name, String pass, Int32 roleid = 1, String display = null)
public static User Add(String name, String pass, Int32 roleid = 1, String display = null)
{
//var entity = Find(_.Name == name);
//if (entity != null) return entity;
if (pass.IsNullOrEmpty()) pass = name;
var entity = new TEntity
var entity = new User
{
Name = name,
Password = pass.MD5(),
@ -303,7 +300,7 @@ namespace XCode.Membership
/// <param name="password"></param>
/// <param name="rememberme">是否记住密码</param>
/// <returns></returns>
public static TEntity Login(String username, String password, Boolean rememberme = false)
public static User Login(String username, String password, Boolean rememberme = false)
{
if (String.IsNullOrEmpty(username)) throw new ArgumentNullException(nameof(username));
//if (String.IsNullOrEmpty(password)) throw new ArgumentNullException("password");
@ -319,7 +316,7 @@ namespace XCode.Membership
}
}
static TEntity Login(String username, String password, Int32 hashTimes)
static User Login(String username, String password, Int32 hashTimes)
{
if (String.IsNullOrEmpty(username)) throw new ArgumentNullException(nameof(username), "该帐号不存在!");

View File

@ -18,7 +18,7 @@ namespace XCode.Membership
[BindIndex("IX_User_RoleID", false, "RoleID")]
[BindIndex("IX_User_UpdateTime", false, "UpdateTime")]
[BindTable("User", Description = "用户", ConnName = "Membership", DbType = DatabaseType.None)]
public partial class User<TEntity> : IUser
public partial class User : IUser
{
#region
private Int32 _ID;

View File

@ -8,26 +8,18 @@ using System.Xml.Serialization;
using NewLife;
using NewLife.Collections;
using NewLife.Log;
using NewLife.Model;
using NewLife.Reflection;
using NewLife.Threading;
namespace XCode.Membership
{
/// <summary>菜单</summary>
[Serializable]
[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]
public class Menu : Menu<Menu> { }
/// <summary>菜单</summary>
public partial class Menu<TEntity> : EntityTree<TEntity>, IMenu where TEntity : Menu<TEntity>, new()
public partial class Menu : EntityTree<Menu>, IMenu
{
#region
static Menu()
{
new TEntity();
EntityFactory.Register(typeof(TEntity), new MenuFactory());
EntityFactory.Register(typeof(Menu), new MenuFactory());
//ObjectContainer.Current.AutoRegister<IMenuFactory, MenuFactory>();
}
@ -162,7 +154,7 @@ namespace XCode.Membership
/// <summary>根据编号查找</summary>
/// <param name="id"></param>
/// <returns></returns>
public static TEntity FindByID(Int32 id)
public static Menu FindByID(Int32 id)
{
if (id <= 0) return null;
@ -172,22 +164,22 @@ namespace XCode.Membership
/// <summary>根据名字查找</summary>
/// <param name="name">名称</param>
/// <returns></returns>
public static TEntity FindByName(String name) => Meta.Cache.Find(e => e.Name.EqualIgnoreCase(name));
public static Menu FindByName(String name) => Meta.Cache.Find(e => e.Name.EqualIgnoreCase(name));
/// <summary>根据全名查找</summary>
/// <param name="name">全名</param>
/// <returns></returns>
public static TEntity FindByFullName(String name) => Meta.Cache.Find(e => e.FullName.EqualIgnoreCase(name));
public static Menu FindByFullName(String name) => Meta.Cache.Find(e => e.FullName.EqualIgnoreCase(name));
/// <summary>根据Url查找</summary>
/// <param name="url"></param>
/// <returns></returns>
public static TEntity FindByUrl(String url) => Meta.Cache.Find(e => e.Url.EqualIgnoreCase(url));
public static Menu FindByUrl(String url) => Meta.Cache.Find(e => e.Url.EqualIgnoreCase(url));
/// <summary>根据名字查找,支持路径查找</summary>
/// <param name="name">名称</param>
/// <returns></returns>
public static TEntity FindForName(String name)
public static Menu FindForName(String name)
{
var entity = FindByName(name);
if (entity != null) return entity;
@ -198,7 +190,7 @@ namespace XCode.Membership
/// <summary>查找指定菜单的子菜单</summary>
/// <param name="id"></param>
/// <returns></returns>
public static List<TEntity> FindAllByParentID(Int32 id) => Meta.Cache.FindAll(e => e.ParentID == id).OrderByDescending(e => e.Sort).ThenBy(e => e.ID).ToList();
public static List<Menu> FindAllByParentID(Int32 id) => Meta.Cache.FindAll(e => e.ParentID == id).OrderByDescending(e => e.Sort).ThenBy(e => e.ID).ToList();
/// <summary>取得当前角色的子菜单,有权限、可显示、排序</summary>
/// <param name="filters"></param>
@ -224,14 +216,13 @@ namespace XCode.Membership
/// <returns></returns>
public IMenu Add(String name, String displayName, String fullName, String url)
{
var entity = new TEntity
var entity = new Menu
{
Name = name,
DisplayName = displayName,
FullName = fullName,
Url = url,
ParentID = ID,
//Parent = this as TEntity,
Visible = ID == 0 || displayName != null
};
@ -286,7 +277,7 @@ namespace XCode.Membership
///// <summary>写日志</summary>
///// <param name="action">操作</param>
///// <param name="remark">备注</param>
//public static void WriteLog(String action, String remark) => LogProvider.Provider.WriteLog(typeof(TEntity), action, remark);
//public static void WriteLog(String action, String remark) => LogProvider.Provider.WriteLog(typeof(Menu), action, remark);
#endregion
#region
@ -309,7 +300,7 @@ namespace XCode.Membership
/// <returns></returns>
String IMenu.GetFullPath(Boolean includeSelf, String separator, Func<IMenu, String> func)
{
Func<TEntity, String> d = null;
Func<Menu, String> d = null;
if (func != null) d = item => func(item);
return GetFullPath(includeSelf, separator, d);
@ -458,7 +449,7 @@ namespace XCode.Membership
var method = item.Key;
var dn = method.GetDisplayName();
if (!dn.IsNullOrEmpty()) dn = dn.Replace("{type}", (controller as TEntity)?.FriendName);
if (!dn.IsNullOrEmpty()) dn = dn.Replace("{type}", (controller as Menu)?.FriendName);
var pmName = !dn.IsNullOrEmpty() ? dn : method.Name;
if (item.Value <= (Int32)PermissionFlags.Delete) pmName = ((PermissionFlags)item.Value).GetDescription();

View File

@ -17,7 +17,7 @@ namespace XCode.Membership
[BindIndex("IX_Menu_Name", false, "Name")]
[BindIndex("IU_Menu_ParentID_Name", true, "ParentID,Name")]
[BindTable("Menu", Description = "菜单", ConnName = "Membership", DbType = DatabaseType.None)]
public partial class Menu<TEntity> : IMenu
public partial class Menu : IMenu
{
#region
private Int32 _ID;

View File

@ -8,7 +8,6 @@ using System.Xml.Serialization;
using NewLife;
using NewLife.Collections;
using NewLife.Log;
using NewLife.Threading;
namespace XCode.Membership
{
@ -43,21 +42,11 @@ namespace XCode.Membership
}
/// <summary>角色</summary>
[Serializable]
[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]
public class Role : Role<Role> { }
/// <summary>角色</summary>
/// <typeparam name="TEntity"></typeparam>
public abstract partial class Role<TEntity> : LogEntity<TEntity>
where TEntity : Role<TEntity>, new()
public partial class Role : LogEntity<Role>
{
#region
static Role()
{
// 用于引发基类的静态构造函数
var entity = new TEntity();
//Meta.Factory.FullInsert = false;
Meta.Modules.Add<UserModule>();
@ -90,14 +79,14 @@ namespace XCode.Membership
}
else
{
if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}角色数据……", typeof(TEntity).Name);
if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}角色数据……", typeof(Role).Name);
Add("管理员", true, "默认拥有全部最高权限,由系统工程师使用,安装配置整个系统");
Add("高级用户", false, "业务管理人员,可以管理业务模块,可以分配授权用户等级");
Add("普通用户", false, "普通业务人员,可以使用系统常规业务模块功能");
Add("游客", false, "新注册默认属于游客");
if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}角色数据!", typeof(TEntity).Name);
if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}角色数据!", typeof(Role).Name);
}
//CheckRole();
@ -243,7 +232,7 @@ namespace XCode.Membership
/// <summary>根据编号查找角色</summary>
/// <param name="id"></param>
/// <returns></returns>
public static TEntity FindByID(Int32 id)
public static Role FindByID(Int32 id)
{
if (id <= 0 || Meta.Cache.Entities == null || Meta.Cache.Entities.Count < 1) return null;
@ -258,7 +247,7 @@ namespace XCode.Membership
/// <summary>根据名称查找角色</summary>
/// <param name="name">名称</param>
/// <returns></returns>
public static TEntity FindByName(String name)
public static Role FindByName(String name)
{
if (String.IsNullOrEmpty(name) || Meta.Cache.Entities == null || Meta.Cache.Entities.Count < 1) return null;
@ -421,13 +410,13 @@ namespace XCode.Membership
/// <param name="issys"></param>
/// <param name="remark"></param>
/// <returns></returns>
public static TEntity Add(String name, Boolean issys, String remark = null)
public static Role Add(String name, Boolean issys, String remark = null)
{
//var entity = FindByName(name);
var entity = Find(__.Name, name);
if (entity != null) return entity;
entity = new TEntity
entity = new Role
{
Name = name,
IsSystem = issys,

View File

@ -16,7 +16,7 @@ namespace XCode.Membership
[Description("角色")]
[BindIndex("IU_Role_Name", true, "Name")]
[BindTable("Role", Description = "角色", ConnName = "Membership", DbType = DatabaseType.None)]
public partial class Role<TEntity> : IRole
public partial class Role : IRole
{
#region
private Int32 _ID;

View File

@ -10,19 +10,14 @@ using NewLife.Log;
namespace XCode.Membership
{
/// <summary>部门</summary>
[Serializable]
[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]
public class Department : Department<Department> { }
/// <summary>部门。组织机构,多级树状结构</summary>
public partial class Department<TEntity> : Entity<TEntity> where TEntity : Department<TEntity>, new()
public partial class Department : Entity<Department>
{
#region
static Department()
{
// 用于引发基类的静态构造函数,所有层次的泛型实体类都应该有一个
var entity = new TEntity();
//// 用于引发基类的静态构造函数,所有层次的泛型实体类都应该有一个
//var entity = new Department();
// 累加字段
//var df = Meta.Factory.AdditionalFields;
@ -53,7 +48,7 @@ namespace XCode.Membership
if (Meta.Count > 0) return;
if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}数据……", typeof(TEntity).Name);
if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}数据……", typeof(Department).Name);
var root = Add("总公司", "001", 0);
Add("行政部", "011", root.ID);
@ -64,7 +59,7 @@ namespace XCode.Membership
Add("行政部", "111", root.ID);
Add("市场部", "112", root.ID);
if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}数据!", typeof(TEntity).Name);
if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}数据!", typeof(Department).Name);
}
/// <summary>添加用户,如果存在则直接返回</summary>
@ -72,9 +67,9 @@ namespace XCode.Membership
/// <param name="code"></param>
/// <param name="parentid"></param>
/// <returns></returns>
public static TEntity Add(String name, String code, Int32 parentid)
public static Department Add(String name, String code, Int32 parentid)
{
var entity = new TEntity
var entity = new Department
{
Name = name,
Code = code,
@ -92,10 +87,10 @@ namespace XCode.Membership
#region
/// <summary>管理者</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public UserX Manager => Extends.Get(nameof(Manager), k => UserX.FindByID(ManagerID));
public User Manager => Extends.Get(nameof(Manager), k => User.FindByID(ManagerID));
/// <summary>管理者</summary>
[Map(__.ManagerID, typeof(UserX), __.ID)]
[Map(__.ManagerID, typeof(User), __.ID)]
public String ManagerName => Manager?.ToString();
#endregion
@ -103,7 +98,7 @@ namespace XCode.Membership
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static TEntity FindByID(Int32 id)
public static Department FindByID(Int32 id)
{
if (id <= 0) return null;
@ -119,7 +114,7 @@ namespace XCode.Membership
/// <summary>根据名称查找</summary>
/// <param name="name">名称</param>
/// <returns>实体列表</returns>
public static IList<TEntity> FindAllByName(String name)
public static IList<Department> FindAllByName(String name)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.Name == name);
@ -131,7 +126,7 @@ namespace XCode.Membership
/// <param name="name">名称</param>
/// <param name="parentid">父级</param>
/// <returns>实体对象</returns>
public static TEntity FindByNameAndParentID(String name, Int32 parentid)
public static Department FindByNameAndParentID(String name, Int32 parentid)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Name == name && e.ParentID == parentid);
@ -142,7 +137,7 @@ namespace XCode.Membership
/// <summary>根据代码查找</summary>
/// <param name="code">代码</param>
/// <returns>实体对象</returns>
public static TEntity FindByCode(String code)
public static Department FindByCode(String code)
{
if (code.IsNullOrEmpty()) return null;
@ -161,7 +156,7 @@ namespace XCode.Membership
/// <param name="key"></param>
/// <param name="page"></param>
/// <returns></returns>
public static IList<TEntity> Search(Int32 parentId, Boolean? enable, Boolean? visible, String key, PageParameter page)
public static IList<Department> Search(Int32 parentId, Boolean? enable, Boolean? visible, String key, PageParameter page)
{
var exp = new WhereExpression();
if (parentId >= 0) exp &= _.ParentID == parentId;

View File

@ -19,7 +19,7 @@ namespace XCode.Membership
[BindIndex("IX_Department_Code", false, "Code")]
[BindIndex("IX_Department_UpdateTime", false, "UpdateTime")]
[BindTable("Department", Description = "部门。组织机构,多级树状结构", ConnName = "Membership", DbType = DatabaseType.None)]
public partial class Department<TEntity> : IDepartment
public partial class Department : IDepartment
{
#region
private Int32 _ID;

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Text;
using XCode.Membership;
using Xunit;
using static XCode.Membership.UserX;
using static XCode.Membership.User;
namespace XUnitTest.XCode.BigData
{
@ -12,7 +12,7 @@ namespace XUnitTest.XCode.BigData
[Fact(DisplayName = "聚合")]
public void AggregateTest()
{
//var list = UserX.FindAll(null, null, UserX._.Logins.Sum());
//var list = User.FindAll(null, null, User._.Logins.Sum());
}
}
}

View File

@ -58,30 +58,30 @@ namespace XUnitTest.XCode.Code
Assert.Equal(target, rs);
}
[Fact]
public void GenericType()
{
var option = new BuilderOption
{
ConnName = "MyConn",
Namespace = "Company.MyName"
};
//[Fact]
//public void GenericType()
//{
// var option = new BuilderOption
// {
// ConnName = "MyConn",
// Namespace = "Company.MyName"
// };
var builder = new EntityBuilder
{
Table = _table,
GenericType = true,
Option = option,
};
// var builder = new EntityBuilder
// {
// Table = _table,
// GenericType = true,
// Option = option,
// };
builder.Execute();
// builder.Execute();
var rs = builder.ToString();
Assert.NotEmpty(rs);
// var rs = builder.ToString();
// Assert.NotEmpty(rs);
var target = File.ReadAllText("Code\\entity_user_generictype.cs".GetFullPath());
Assert.Equal(target, rs);
}
// var target = File.ReadAllText("Code\\entity_user_generictype.cs".GetFullPath());
// Assert.Equal(target, rs);
//}
[Fact]
public void BuildTT()
@ -99,7 +99,8 @@ namespace XUnitTest.XCode.Code
// 生成实体类
//EntityBuilder.BuildTables(tables, option);
EntityBuilder.Build(file);
//EntityBuilder.Build(file);
EntityBuilder.BuildFile(file);
// 生成简易模型类
option.Output = @"Output\EntityModels\";

View File

@ -11,7 +11,7 @@ namespace XUnitTest.XCode.Configuration
[Fact(DisplayName = "基础测试")]
public void BasicTest()
{
var fi = UserX._.Password;
var fi = User._.Password;
Assert.Equal("Password", fi.Name);
Assert.Equal("密码", fi.DisplayName);
Assert.Equal("密码", fi.Description);
@ -32,12 +32,12 @@ namespace XUnitTest.XCode.Configuration
Assert.Null(fi.OriField);
Assert.Null(fi.Map);
Assert.True(UserX._.ID.IsIdentity);
Assert.True(UserX._.ID.PrimaryKey);
Assert.True(UserX._.Name.Master);
Assert.False(UserX._.Name.IsNullable);
Assert.True(User._.ID.IsIdentity);
Assert.True(User._.ID.PrimaryKey);
Assert.True(User._.Name.Master);
Assert.False(User._.Name.IsNullable);
fi = UserX.Meta.Table.FindByName("DepartmentName");
fi = User.Meta.Table.FindByName("DepartmentName");
Assert.NotNull(fi);
Assert.NotNull(fi.OriField);
Assert.Equal("DepartmentID", fi.OriField.Name);

View File

@ -13,9 +13,9 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void BackupTest()
{
var n = UserX.Meta.Count;
var dal = UserX.Meta.Session.Dal;
var table = UserX.Meta.Table.DataTable;
var n = User.Meta.Count;
var dal = User.Meta.Session.Dal;
var table = User.Meta.Table.DataTable;
dal.Backup(table, $"data/{table.Name}.table");
dal.Backup(table, $"data/{table.Name}.gz");
@ -24,8 +24,8 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void BackupAllTest()
{
var n = UserX.Meta.Count;
var dal = UserX.Meta.Session.Dal;
var n = User.Meta.Count;
var dal = User.Meta.Session.Dal;
var tables = EntityFactory.GetTables(dal.ConnName, false);
dal.BackupAll(tables, $"data/{dal.ConnName}.zip");
@ -36,19 +36,19 @@ namespace XUnitTest.XCode.DataAccessLayer
{
try
{
var dal = UserX.Meta.Session.Dal;
var dal = User.Meta.Session.Dal;
// 随机连接名得到SQLite连接字符串实行导入
UserX.Meta.ConnName = Rand.NextString(8);
User.Meta.ConnName = Rand.NextString(8);
var dal2 = UserX.Meta.Session.Dal;
var dal2 = User.Meta.Session.Dal;
var rs = dal2.RestoreAll($"data/{dal.ConnName}.zip", null);
Assert.NotNull(rs);
}
finally
{
UserX.Meta.ConnName = null;
User.Meta.ConnName = null;
}
}
}

View File

@ -17,7 +17,7 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void CreateUpperTableSQLite()
{
var table = UserX.Meta.Table.DataTable;
var table = User.Meta.Table.DataTable;
var db = DbFactory.Create(DatabaseType.SQLite);
db.NameFormat = NameFormats.Upper;
@ -60,7 +60,7 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void CreateUpperTableMySql()
{
var table = UserX.Meta.Table.DataTable;
var table = User.Meta.Table.DataTable;
var db = DbFactory.Create(DatabaseType.MySql);
db.NameFormat = NameFormats.Upper;
@ -104,7 +104,7 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void CreateLowerTableSQLite()
{
var table = UserX.Meta.Table.DataTable;
var table = User.Meta.Table.DataTable;
var db = DbFactory.Create(DatabaseType.SQLite);
db.NameFormat = NameFormats.Lower;
@ -147,7 +147,7 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void CreateLowerTableMySql()
{
var table = UserX.Meta.Table.DataTable;
var table = User.Meta.Table.DataTable;
var db = DbFactory.Create(DatabaseType.MySql);
db.NameFormat = NameFormats.Lower;
@ -191,7 +191,7 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void CreateUnderlineTableSQLite()
{
var table = UserX.Meta.Table.DataTable;
var table = User.Meta.Table.DataTable;
var db = DbFactory.Create(DatabaseType.SQLite);
db.NameFormat = NameFormats.Underline;
@ -234,7 +234,7 @@ namespace XUnitTest.XCode.DataAccessLayer
[Fact]
public void CreateUnderlineTableMySql()
{
var table = UserX.Meta.Table.DataTable;
var table = User.Meta.Table.DataTable;
var db = DbFactory.Create(DatabaseType.MySql);
db.NameFormat = NameFormats.Underline;

View File

@ -6,7 +6,7 @@ using XCode;
using XCode.DataAccessLayer;
using XCode.Membership;
using Xunit;
using static XCode.Membership.UserX;
using static XCode.Membership.User;
namespace XUnitTest.XCode.EntityTests
{
@ -21,10 +21,10 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void InsertTestSQLite()
{
var factory = UserX.Meta.Factory;
var session = UserX.Meta.Session;
var factory = User.Meta.Factory;
var session = User.Meta.Session;
var user = new UserX
var user = new User
{
Name = "Stone",
DisplayName = "大石头",
@ -41,12 +41,12 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void InsertTestMySqlUnderline()
{
using var split = UserX.Meta.CreateSplit("mysql_underline", null);
using var split = User.Meta.CreateSplit("mysql_underline", null);
var factory = UserX.Meta.Factory;
var session = UserX.Meta.Session;
var factory = User.Meta.Factory;
var session = User.Meta.Session;
var user = new UserX
var user = new User
{
Name = "Stone",
DisplayName = "大石头",
@ -63,10 +63,10 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void UpdateTestSQLite()
{
var factory = UserX.Meta.Factory;
var session = UserX.Meta.Session;
var factory = User.Meta.Factory;
var session = User.Meta.Session;
var user = new UserX
var user = new User
{
ID = 2,
Name = "Stone",
@ -84,12 +84,12 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void UpdateTestMySqlUnderline()
{
using var split = UserX.Meta.CreateSplit("mysql_underline", null);
using var split = User.Meta.CreateSplit("mysql_underline", null);
var factory = UserX.Meta.Factory;
var session = UserX.Meta.Session;
var factory = User.Meta.Factory;
var session = User.Meta.Session;
var user = new UserX
var user = new User
{
ID = 2,
Name = "Stone",
@ -107,10 +107,10 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void DeleteTestSQLite()
{
var factory = UserX.Meta.Factory;
var session = UserX.Meta.Session;
var factory = User.Meta.Factory;
var session = User.Meta.Session;
var user = new UserX
var user = new User
{
ID = 2,
};
@ -122,12 +122,12 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void DeleteTestMySqlUnderline()
{
using var split = UserX.Meta.CreateSplit("mysql_underline", null);
using var split = User.Meta.CreateSplit("mysql_underline", null);
var factory = UserX.Meta.Factory;
var session = UserX.Meta.Session;
var factory = User.Meta.Factory;
var session = User.Meta.Session;
var user = new UserX
var user = new User
{
ID = 2,
};
@ -139,8 +139,8 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void SelectTestSQLite()
{
var exp = UserX._.Name == "Stone" & UserX._.DisplayName == "大石头" & UserX._.Logins > 0 & UserX._.RegisterTime < new DateTime(2020, 9, 1);
var builder = UserX.CreateBuilder(exp, UserX._.UpdateUserID.Desc(), null);
var exp = User._.Name == "Stone" & User._.DisplayName == "大石头" & User._.Logins > 0 & User._.RegisterTime < new DateTime(2020, 9, 1);
var builder = User.CreateBuilder(exp, User._.UpdateUserID.Desc(), null);
var sql = builder.ToString();
Assert.Equal(@"Select * From User Where Name='Stone' And DisplayName='大石头' And Logins>0 And RegisterTime<'2020-09-01 00:00:00' Order By UpdateUserID Desc", sql);
}
@ -148,10 +148,10 @@ namespace XUnitTest.XCode.EntityTests
[Fact]
public void SelectTestMySqlUnderline()
{
using var split = UserX.Meta.CreateSplit("mysql_underline", null);
using var split = User.Meta.CreateSplit("mysql_underline", null);
var exp = UserX._.Name == "Stone" & UserX._.DisplayName == "大石头" & UserX._.Logins > 0 & UserX._.RegisterTime < new DateTime(2020, 9, 1);
var builder = UserX.CreateBuilder(exp, UserX._.UpdateUserID.Desc(), null);
var exp = User._.Name == "Stone" & User._.DisplayName == "大石头" & User._.Logins > 0 & User._.RegisterTime < new DateTime(2020, 9, 1);
var builder = User.CreateBuilder(exp, User._.UpdateUserID.Desc(), null);
var sql = builder.ToString();
Assert.Equal(@"Select * From `user` Where name='Stone' And display_name='大石头' And logins>0 And register_time<'2020-09-01 00:00:00' Order By update_user_id Desc", sql);
}

View File

@ -13,14 +13,14 @@ namespace XUnitTest.XCode.Model
private IDatabase _dbLog;
public FieldInTests()
{
_dbUser = UserX.Meta.Session.Dal.Db;
_dbUser = User.Meta.Session.Dal.Db;
_dbLog = Log.Meta.Session.Dal.Db;
}
[Fact]
public void In()
{
var fi = UserX._.RoleID;
var fi = User._.RoleID;
var exp = fi.In(new[] { 1, 2, 3, 4 });
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleID In(1,2,3,4)", where);
@ -53,7 +53,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void NotIn()
{
var fi = UserX._.RoleID;
var fi = User._.RoleID;
var exp = fi.NotIn(new[] { 1, 2, 3, 4 });
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleID Not In(1,2,3,4)", where);
@ -86,7 +86,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void InForSelectBuilder()
{
var fi = UserX._.RoleID;
var fi = User._.RoleID;
var exp = fi.In(Role.FindSQLWithKey());
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleID In(Select ID From Role)", where);
@ -97,7 +97,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void NotInForSelectBuilder()
{
var fi = UserX._.RoleID;
var fi = User._.RoleID;
var exp = fi.NotIn(Role.FindSQLWithKey());
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleID Not In(Select ID From Role)", where);

View File

@ -13,14 +13,14 @@ namespace XUnitTest.XCode.Model
private IDatabase _dbLog;
public FieldLikeTests()
{
_dbUser = UserX.Meta.Session.Dal.Db;
_dbUser = User.Meta.Session.Dal.Db;
_dbLog = Log.Meta.Session.Dal.Db;
}
[Fact]
public void Contains()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.Contains(",1,2,3,");
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleIds Like '%,1,2,3,%'", where);
@ -31,7 +31,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void ContainsWithParameter()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.Contains(",1,");
var ps = new Dictionary<String, Object>();
var where = exp.GetString(_dbUser, ps);
@ -47,7 +47,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void NotContains()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.NotContains(",1,2,3,");
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleIds Not Like '%,1,2,3,%'", where);
@ -58,7 +58,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void NotContainsWithParameter()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.NotContains(",1,2,3,");
var ps = new Dictionary<String, Object>();
var where = exp.GetString(_dbUser, ps);
@ -74,7 +74,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void StartsWith()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.StartsWith(",1,2,3,");
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleIds Like ',1,2,3,%'", where);
@ -85,7 +85,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void StartsWithWithParameter()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.StartsWith(",1,2,3,");
var ps = new Dictionary<String, Object>();
var where = exp.GetString(_dbUser, ps);
@ -101,7 +101,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void EndsWith()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.EndsWith(",1,2,3,");
var where = exp.GetString(_dbUser, null);
Assert.Equal("RoleIds Like '%,1,2,3,'", where);
@ -112,7 +112,7 @@ namespace XUnitTest.XCode.Model
[Fact]
public void EndsWithWithParameter()
{
var fi = UserX._.RoleIds;
var fi = User._.RoleIds;
var exp = fi.EndsWith(",1,2,3,");
var ps = new Dictionary<String, Object>();
var where = exp.GetString(_dbUser, ps);

View File

@ -14,7 +14,7 @@ namespace XUnitTest.XCode.Model
private IDatabase _dbArea;
public FieldNormalTests()
{
_dbUser = UserX.Meta.Session.Dal.Db;
_dbUser = User.Meta.Session.Dal.Db;
_dbLog = Log.Meta.Session.Dal.Db;
_dbArea = Area.Meta.Session.Dal.Db;
}

View File

@ -92,7 +92,7 @@ namespace XUnitTest.XCode.Model
[Fact(DisplayName = "多层变量")]
public void ParseVar()
{
var user = new UserX { ID = 1234 };
var user = new User { ID = 1234 };
var dic = new Dictionary<String, Object>(StringComparer.OrdinalIgnoreCase)
{
["user"] = user
@ -146,7 +146,7 @@ namespace XUnitTest.XCode.Model
[Fact(DisplayName = "未支持表达式")]
public void ParseUnknown()
{
var user = new UserX { ID = 1234 };
var user = new User { ID = 1234 };
var dic = new Dictionary<String, Object>(StringComparer.OrdinalIgnoreCase)
{
["user"] = user