不再支持泛型实体类,简化系统架构
This commit is contained in:
parent
a0c59eb9b1
commit
7e4d366359
|
@ -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("//{");
|
||||
{
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
var tables = ClassBuilder.LoadModels(null, option, out _);
|
||||
|
||||
// 生成实体类
|
||||
EntityBuilder.Build();
|
||||
EntityBuilder.BuildFile();
|
||||
//EntityBuilder.BuildTables(tables, option);
|
||||
|
||||
// 生成简易模型类
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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> { }
|
||||
}
|
|
@ -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="编号" />
|
||||
|
|
|
@ -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> { }
|
||||
}
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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), "该帐号不存在!");
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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\";
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue