新增用于实体模型拷贝所使用的接口约束

This commit is contained in:
智能大石头 2023-03-27 23:13:39 +08:00
parent bb460e23be
commit a46c2180b8
17 changed files with 85 additions and 80 deletions

1
.gitignore vendored
View File

@ -26,3 +26,4 @@ bld/
/Avatars
/XCode/Membership/Config
/XUnitTest.XCode/TestEntity/Config
/XCode/Membership/Log

View File

@ -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("{");

View File

@ -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");

View File

@ -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;

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;