新增用于实体模型拷贝所使用的接口约束
This commit is contained in:
parent
bb460e23be
commit
a46c2180b8
|
@ -26,3 +26,4 @@ bld/
|
|||
/Avatars
|
||||
/XCode/Membership/Config
|
||||
/XUnitTest.XCode/TestEntity/Config
|
||||
/XCode/Membership/Log
|
||||
|
|
|
@ -512,7 +512,7 @@ public class ClassBuilder
|
|||
/// <summary>生成实体转模型函数</summary>
|
||||
/// <param name="modelClass"></param>
|
||||
/// <param name="modelInterface"></param>
|
||||
protected virtual void BuildEntityToModel(String modelClass, String modelInterface)
|
||||
protected virtual void BuildToModel(String modelClass, String modelInterface)
|
||||
{
|
||||
WriteLine($"public {modelInterface} ToModel()");
|
||||
WriteLine("{");
|
||||
|
|
|
@ -255,10 +255,15 @@ public class EntityBuilder : ClassBuilder
|
|||
{
|
||||
// 有可能实现了接口拷贝
|
||||
var model = Option.ModelNameForCopy;
|
||||
if (!model.IsNullOrEmpty() && model.StartsWith("I")) bs.Add(model);
|
||||
if (!model.IsNullOrEmpty())
|
||||
{
|
||||
if (model.StartsWith("I")) bs.Add(model);
|
||||
|
||||
bs.Add($"IEntity<{model}>");
|
||||
}
|
||||
|
||||
// 数据类不要实体基类
|
||||
bs = bs.Where(e => !e.Contains("Entity")).ToList();
|
||||
bs = bs.Where(e => !e.StartsWithIgnoreCase("Entity<", "EntityBase<")).ToList();
|
||||
if (bs.Count > 0) name = bs.Distinct().Join(", ");
|
||||
}
|
||||
|
||||
|
@ -1263,7 +1268,7 @@ public class EntityBuilder : ClassBuilder
|
|||
var toModel = Option.ModelNameForToModel;
|
||||
if (!toModel.IsNullOrEmpty() && !Option.ModelNameForCopy.IsNullOrEmpty())
|
||||
{
|
||||
BuildEntityToModel(toModel.Replace("{name}", ClassName), Option.ModelNameForCopy.Replace("{name}", ClassName));
|
||||
BuildToModel(toModel.Replace("{name}", ClassName), Option.ModelNameForCopy.Replace("{name}", ClassName));
|
||||
WriteLine("");
|
||||
}
|
||||
WriteLine("#endregion");
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using System.ComponentModel;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web.Script.Serialization;
|
||||
using System.Xml.Serialization;
|
||||
using NewLife.Data;
|
||||
|
@ -124,49 +125,8 @@ public abstract partial class EntityBase : IEntity, IModel, IExtend, ICloneable
|
|||
/// <param name="entity">来源实体对象</param>
|
||||
/// <param name="setDirty">是否设置脏数据</param>
|
||||
/// <returns>实际复制成员数</returns>
|
||||
public virtual Int32 CopyFrom(IEntity entity, Boolean setDirty = true)
|
||||
{
|
||||
if (entity == this) return 0;
|
||||
|
||||
IEntity src = this;
|
||||
var fact1 = src.GetType().AsFactory();
|
||||
var fact2 = entity.GetType().AsFactory();
|
||||
var nsSrc = fact1.FieldNames;
|
||||
//if (nsSrc == null || nsSrc.Count <= 0) return 0;
|
||||
var nsDes = fact2.FieldNames;
|
||||
if (nsDes == null || nsDes.Count <= 0) return 0;
|
||||
|
||||
var n = 0;
|
||||
foreach (var item in nsDes)
|
||||
{
|
||||
if (nsSrc.Contains(item))
|
||||
{
|
||||
if (setDirty)
|
||||
src.SetItem(item, entity[item]);
|
||||
else
|
||||
src[item] = entity[item];
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果没有该字段,则写入到扩展属性里面去
|
||||
src[item] = entity[item];
|
||||
if (setDirty) Dirtys[item] = true;
|
||||
}
|
||||
|
||||
n++;
|
||||
}
|
||||
// 赋值扩展数据
|
||||
//entity.Extends.CopyTo(src.Extends);
|
||||
if (entity is EntityBase entity2 && entity2._Items != null && entity2._Items.Count > 0)
|
||||
{
|
||||
foreach (var item in entity2._Items)
|
||||
{
|
||||
src[item.Key] = item.Value;
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
[Obsolete("=>CopyFrom(IModel model, Boolean setDirty)")]
|
||||
public virtual Int32 CopyFrom(IEntity entity, Boolean setDirty = true) => CopyFrom((IModel)entity, setDirty);
|
||||
|
||||
/// <summary>复制来自指定模型的成员,可以是不同类型</summary>
|
||||
/// <param name="model">来源实体对象</param>
|
||||
|
@ -179,14 +139,51 @@ public abstract partial class EntityBase : IEntity, IModel, IExtend, ICloneable
|
|||
IEntity src = this;
|
||||
|
||||
var n = 0;
|
||||
foreach (var item in src.GetType().AsFactory().FieldNames)
|
||||
if (model is IEntity entity)
|
||||
{
|
||||
if (setDirty)
|
||||
src.SetItem(item, model[item]);
|
||||
else
|
||||
src[item] = model[item];
|
||||
var nsSrc = src.GetType().AsFactory().FieldNames;
|
||||
var nsDes = entity.GetType().AsFactory().FieldNames;
|
||||
if (nsDes == null || nsDes.Count <= 0) return 0;
|
||||
|
||||
n++;
|
||||
foreach (var item in nsDes)
|
||||
{
|
||||
if (nsSrc.Contains(item))
|
||||
{
|
||||
if (setDirty)
|
||||
src.SetItem(item, entity[item]);
|
||||
else
|
||||
src[item] = entity[item];
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果没有该字段,则写入到扩展属性里面去
|
||||
src[item] = entity[item];
|
||||
if (setDirty) Dirtys[item] = true;
|
||||
}
|
||||
|
||||
n++;
|
||||
}
|
||||
// 赋值扩展数据
|
||||
//entity.Extends.CopyTo(src.Extends);
|
||||
if (entity is EntityBase entity2 && entity2._Items != null && entity2._Items.Count > 0)
|
||||
{
|
||||
foreach (var item in entity2._Items)
|
||||
{
|
||||
src[item.Key] = item.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var item in src.GetType().AsFactory().FieldNames)
|
||||
{
|
||||
if (setDirty)
|
||||
src.SetItem(item, model[item]);
|
||||
else
|
||||
src[item] = model[item];
|
||||
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
|
|
|
@ -2,6 +2,19 @@
|
|||
|
||||
namespace XCode;
|
||||
|
||||
/// <summary>数据实体接口扩展</summary>
|
||||
/// <typeparam name="TModel"></typeparam>
|
||||
public interface IEntity<TModel>
|
||||
{
|
||||
/// <summary>拷贝模型对象</summary>
|
||||
/// <param name="model"></param>
|
||||
void Copy(TModel model);
|
||||
|
||||
///// <summary>转模型对象</summary>
|
||||
///// <returns></returns>
|
||||
//TModel ToModel();
|
||||
}
|
||||
|
||||
/// <summary>数据实体接口</summary>
|
||||
public interface IEntity : IModel
|
||||
{
|
||||
|
@ -75,33 +88,22 @@ public interface IEntity : IModel
|
|||
#endregion
|
||||
|
||||
#region 获取/设置 字段值
|
||||
///// <summary>获取/设置 字段值。</summary>
|
||||
///// <param name="name">字段名</param>
|
||||
///// <returns></returns>
|
||||
//Object this[String name] { get; set; }
|
||||
|
||||
/// <summary>设置字段值</summary>
|
||||
/// <param name="name">字段名</param>
|
||||
/// <param name="value">值</param>
|
||||
/// <returns>返回是否成功设置了数据</returns>
|
||||
Boolean SetItem(String name, Object value);
|
||||
|
||||
///// <summary>设置脏数据项。如果某个键存在并且数据没有脏,则设置</summary>
|
||||
///// <param name="name"></param>
|
||||
///// <param name="value"></param>
|
||||
///// <returns>返回是否成功设置了数据</returns>
|
||||
//Boolean SetNoDirtyItem(String name, Object value);
|
||||
|
||||
/// <summary>克隆实体。创建当前对象的克隆对象,仅拷贝基本字段</summary>
|
||||
/// <param name="setDirty">是否设置脏数据</param>
|
||||
/// <returns></returns>
|
||||
IEntity CloneEntity(Boolean setDirty = true);
|
||||
|
||||
/// <summary>复制来自指定实体的成员,可以是不同类型的实体,只复制共有的基本字段,影响脏数据</summary>
|
||||
/// <param name="entity">来源实体对象</param>
|
||||
/// <param name="setDirty">是否设置脏数据</param>
|
||||
/// <returns>实际复制成员数</returns>
|
||||
Int32 CopyFrom(IEntity entity, Boolean setDirty = true);
|
||||
///// <summary>复制来自指定实体的成员,可以是不同类型的实体,只复制共有的基本字段,影响脏数据</summary>
|
||||
///// <param name="entity">来源实体对象</param>
|
||||
///// <param name="setDirty">是否设置脏数据</param>
|
||||
///// <returns>实际复制成员数</returns>
|
||||
//Int32 CopyFrom(IEntity entity, Boolean setDirty = true);
|
||||
|
||||
/// <summary>复制来自指定模型的成员,可以是不同类型</summary>
|
||||
/// <param name="model">来源实体对象</param>
|
||||
|
|
Binary file not shown.
|
@ -24,7 +24,7 @@ namespace XCode.Membership;
|
|||
[BindIndex("IX_Area_GeoHash", false, "GeoHash")]
|
||||
[BindIndex("IX_Area_UpdateTime_ID", false, "UpdateTime,ID")]
|
||||
[BindTable("Area", Description = "地区。行政区划数据,最高支持四级地址,9位数字", ConnName = "Membership", DbType = DatabaseType.None)]
|
||||
public partial class Area : IArea
|
||||
public partial class Area : IArea, IEntity<AreaModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _ID;
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace XCode.Membership;
|
|||
[BindIndex("IX_Parameter_Category_Name", false, "Category,Name")]
|
||||
[BindIndex("IX_Parameter_UpdateTime", false, "UpdateTime")]
|
||||
[BindTable("Parameter", Description = "字典参数", ConnName = "Membership", DbType = DatabaseType.None)]
|
||||
public partial class Parameter : IParameter
|
||||
public partial class Parameter : IParameter, IEntity<ParameterModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _ID;
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace XCode.Membership;
|
|||
[BindIndex("IX_Log_Category_LinkID_ID", false, "Category,LinkID,ID")]
|
||||
[BindIndex("IX_Log_CreateUserID_ID", false, "CreateUserID,ID")]
|
||||
[BindTable("Log", Description = "日志", ConnName = "Log", DbType = DatabaseType.None)]
|
||||
public partial class Log : ILog
|
||||
public partial class Log : ILog, IEntity<LogModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int64 _ID;
|
||||
|
|
|
@ -24,7 +24,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 : IUser
|
||||
public partial class User : IUser, IEntity<UserModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _ID;
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace XCode.Membership;
|
|||
[Description("租户。多租户SAAS平台,用于隔离业务数据")]
|
||||
[BindIndex("IU_Tenant_Code", true, "Code")]
|
||||
[BindTable("Tenant", Description = "租户。多租户SAAS平台,用于隔离业务数据", ConnName = "Membership", DbType = DatabaseType.None)]
|
||||
public partial class Tenant : ITenant
|
||||
public partial class Tenant : ITenant, IEntity<TenantModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _Id;
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace XCode.Membership;
|
|||
[BindIndex("IU_TenantUser_TenantId_UserId", true, "TenantId,UserId")]
|
||||
[BindIndex("IX_TenantUser_UserId", false, "UserId")]
|
||||
[BindTable("TenantUser", Description = "租户关系。用户选择租户进入系统后,以租户关系角色组替代自有角色组来进行鉴权", ConnName = "Membership", DbType = DatabaseType.None)]
|
||||
public partial class TenantUser : ITenantUser
|
||||
public partial class TenantUser : ITenantUser, IEntity<TenantUserModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _Id;
|
||||
|
|
|
@ -20,7 +20,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 : IMenu
|
||||
public partial class Menu : IMenu, IEntity<MenuModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _ID;
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace XCode.Membership;
|
|||
[Description("角色")]
|
||||
[BindIndex("IU_Role_Name", true, "Name")]
|
||||
[BindTable("Role", Description = "角色", ConnName = "Membership", DbType = DatabaseType.None)]
|
||||
public partial class Role : IRole
|
||||
public partial class Role : IRole, IEntity<RoleModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _ID;
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace XCode.Membership;
|
|||
[BindIndex("IX_Department_UpdateTime", false, "UpdateTime")]
|
||||
[BindIndex("IX_Department_TenantId", false, "TenantId")]
|
||||
[BindTable("Department", Description = "部门。组织机构,多级树状结构", ConnName = "Membership", DbType = DatabaseType.None)]
|
||||
public partial class Department : IDepartment
|
||||
public partial class Department : IDepartment, IEntity<DepartmentModel>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _ID;
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace XCode.Membership;
|
|||
[BindIndex("IX_Log_Category_LinkID_ID", false, "Category,LinkID,ID")]
|
||||
[BindIndex("IX_Log_CreateUserID_ID", false, "CreateUserID,ID")]
|
||||
[BindTable("Log", Description = "日志", ConnName = "Log", DbType = DatabaseType.None)]
|
||||
public partial class Log : ILog
|
||||
public partial class Log : ILog, IEntity<ILog>
|
||||
{
|
||||
#region 属性
|
||||
private Int64 _ID;
|
||||
|
|
|
@ -24,7 +24,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 : IUser
|
||||
public partial class User : IUser, IEntity<IUser>
|
||||
{
|
||||
#region 属性
|
||||
private Int32 _ID;
|
||||
|
|
Loading…
Reference in New Issue