initial commit

This commit is contained in:
tk
2024-11-13 18:18:28 +08:00
commit 013f35e296
1500 changed files with 443723 additions and 0 deletions

View File

@ -0,0 +1,36 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 角色声明
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class AspNetRoleClaims
{
[DisplayName("ID")]
[JsonProperty, Column(IsPrimary = true, IsIdentity = true)]
public int Id { get; set; }
[DisplayName("角色ID")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string RoleId { get; set; }
[DisplayName("角色声明")]
[JsonProperty, Column(StringLength = -2)]
public string ClaimType { get; set; }
[DisplayName("值")]
[JsonProperty, Column(StringLength = -2)]
public string ClaimValue { get; set; }
[Navigate(nameof(RoleId))]
public virtual AspNetRoles AspNetRoles { get; set; }
}
}

View File

@ -0,0 +1,39 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 角色定义
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class AspNetRoles
{
[DisplayName("ID")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string Id { get; set; }
[DisplayName("角色")]
[JsonProperty, Column(StringLength = -2)]
public string Name { get; set; }
[DisplayName("标准化名称")]
[JsonProperty, Column(StringLength = -2)]
public string NormalizedName { get; set; }
[DisplayName("并发票据")]
[JsonProperty, Column(StringLength = -2)]
public string ConcurrencyStamp { get; set; }
//导航属性
[Navigate(nameof(AspNetUserRoles.RoleId))]
[DisplayName("角色表")]
public virtual List<AspNetUserRoles> AspNetUserRoless { get; set; }
}
}

View File

@ -0,0 +1,39 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 用户声明
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class AspNetUserClaims
{
[DisplayName("ID")]
[JsonProperty, Column(IsPrimary = true, IsIdentity = true)]
public int Id { get; set; }
[DisplayName("用户ID")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string UserId { get; set; }
[DisplayName("声明类型")]
[JsonProperty, Column(StringLength = -2)]
public string ClaimType { get; set; }
[DisplayName("值")]
[JsonProperty, Column(StringLength = -2)]
public string ClaimValue { get; set; }
/// <summary>
/// 用户
/// </summary>
[Navigate(nameof(UserId))]
public virtual AspNetUsers AspNetUsers { get; set; }
}
}

View File

@ -0,0 +1,39 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 用户登录
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class AspNetUserLogins
{
[DisplayName("外联登录")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string LoginProvider { get; set; }
[DisplayName("用户ID")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string UserId { get; set; }
[DisplayName("外联Key")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string ProviderKey { get; set; }
[DisplayName("外联名称")]
[JsonProperty, Column(StringLength = -2)]
public string ProviderDisplayName { get; set; }
/// <summary>
/// 用户
/// </summary>
[Navigate(nameof(UserId))]
public virtual AspNetUsers AspNetUsers { get; set; }
}
}

View File

@ -0,0 +1,45 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 角色表
/// <para>存储向哪些用户分配哪些角色</para>
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class AspNetUserRoles
{
[DisplayName("用户ID")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string UserId { get; set; }
[JsonProperty, Column(IsIgnore = true)]
[DisplayName("用户")]
public string UserName { get => roleName ?? (AspNetUserss?.UserName); set => userName = value; }
string userName;
[DisplayName("角色ID")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string RoleId { get; set; }
[JsonProperty, Column(IsIgnore = true)]
[DisplayName("角色名称")]
public string RoleName { get => roleName ?? (AspNetRoless?.Name); set => roleName = value; }
string roleName;
[DisplayName("角色定义")]
[Navigate(nameof(RoleId))]
public virtual AspNetRoles AspNetRoless { get; set; }
[DisplayName("用户表")]
[Navigate(nameof(UserId))]
public virtual AspNetUsers AspNetUserss { get; set; }
}
}

View File

@ -0,0 +1,36 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 用户令牌
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class AspNetUserTokens
{
[DisplayName("用户ID")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string UserId { get; set; }
[DisplayName("名称")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Name { get; set; }
[DisplayName("外部登录提供程序")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string LoginProvider { get; set; }
[DisplayName("值")]
[JsonProperty, Column(StringLength = -2)]
public string Value { get; set; }
[Navigate(nameof(UserId))]
public virtual AspNetUsers AspNetUsers { get; set; }
}
}

View File

@ -0,0 +1,149 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 用户表
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class AspNetUsers
{
[DisplayName("用户ID")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string Id { get; set; }
[JsonProperty, Column(StringLength = -2)]
[DisplayName("用户名")]
public string UserName { get; set; }
[JsonProperty, Column(IsIgnore = true)]
[DisplayName("角色")]
public string RoleName { get => roleName ?? (AspNetUserRoless != null ? string.Join(",", AspNetUserRoless?.Select(a => a.RoleName ?? a.RoleId).ToList()) : ""); set => roleName = value; }
string roleName;
[JsonProperty, Column(StringLength = -2)]
public string Email { get; set; }
[DisplayName("电话")]
[JsonProperty, Column(StringLength = -2)]
public string PhoneNumber { get; set; }
[DisplayName("自定义名称")]
[JsonProperty, Column(StringLength = -2)]
public string Name { get; set; }
[DisplayName("自定义角色")]
[JsonProperty, Column(StringLength = -2)]
public string UserRole { get; set; }
[DisplayName("密码哈希")]
[JsonProperty, Column(StringLength = -2)]
public string PasswordHash { get; set; }
[DisplayName("电子邮件已确认")]
[JsonProperty]
public int EmailConfirmed { get; set; }
[DisplayName("电话号码已确认")]
[JsonProperty]
public int PhoneNumberConfirmed { get; set; }
[DisplayName("锁定结束")]
[JsonProperty, Column(StringLength = -2)]
public string LockoutEnd { get; set; }
[DisplayName("启用双因素登录")]
[JsonProperty]
public int TwoFactorEnabled { get; set; }
[DisplayName("并发票据")]
[JsonProperty, Column(StringLength = -2)]
public string ConcurrencyStamp { get; set; }
[DisplayName("防伪印章")]
[JsonProperty, Column(StringLength = -2)]
public string SecurityStamp { get; set; }
[DisplayName("标准化电子邮件")]
[JsonProperty, Column(StringLength = -2)]
public string NormalizedEmail { get; set; }
[DisplayName("标准化用户名")]
[JsonProperty, Column(StringLength = -2)]
public string NormalizedUserName { get; set; }
[DisplayName("启用锁定")]
[JsonProperty]
public int LockoutEnabled { get; set; }
[DisplayName("国家")]
[JsonProperty, Column(StringLength = -2)]
public string Country { get; set; }
[DisplayName("省")]
[JsonProperty, Column(StringLength = -2)]
public string Province { get; set; }
[DisplayName("城市")]
[JsonProperty, Column(StringLength = -2)]
public string City { get; set; }
[DisplayName("县")]
[JsonProperty, Column(StringLength = -2)]
public string County { get; set; }
[DisplayName("邮编")]
[JsonProperty, Column(StringLength = -2)]
public string Zip { get; set; }
[DisplayName("街道")]
[JsonProperty, Column(StringLength = -2)]
public string Street { get; set; }
[DisplayName("税号")]
[JsonProperty, Column(StringLength = -2)]
public string TaxNumber { get; set; }
[DisplayName("提供者")]
[JsonProperty, Column(StringLength = -2)]
public string provider { get; set; }
[DisplayName("UUID")]
[JsonProperty, Column(StringLength = -2)]
public string UUID { get; set; }
[DisplayName("生日")]
[JsonProperty, Column(StringLength = -2)]
public string DOB { get; set; }
[DisplayName("访问失败次数")]
[JsonProperty]
public int AccessFailedCount { get; set; }
//导航属性
[Navigate(nameof(AspNetUserRoles.UserId))]
[DisplayName("角色表")]
public virtual List<AspNetUserRoles> AspNetUserRoless { get; set; }
[Navigate(nameof(AspNetUserClaims.UserId))]
[DisplayName("用户声明")]
public virtual List<AspNetUserClaims> AspNetUserClaimss { get; set; }
[Navigate(nameof(AspNetUserLogins.UserId))]
[DisplayName("用户登录")]
public virtual List<AspNetUserLogins> AspNetUserLoginss { get; set; }
[JsonProperty, Column(IsIgnore = true)]
[DisplayName("1st角色")]
public string RoleName1st { get => roleName1st ?? ((AspNetUserRoless != null && AspNetUserRoless.Any()) ? AspNetUserRoless?.Select(a => a.RoleName ?? a.RoleId ?? "").First() : ""); set => roleName1st = value; }
string roleName1st;
}
}

View File

@ -0,0 +1,53 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 设备代码
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class DeviceCodes
{
[Display(Name = "用户代码")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string UserCode { get; set; }
[Display(Name = "设备代码")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string DeviceCode { get; set; }
[Display(Name = "主题编号")]
[JsonProperty, Column(StringLength = -2)]
public string SubjectId { get; set; }
[Display(Name = "会话编号")]
[JsonProperty, Column(StringLength = -2)]
public string SessionId { get; set; }
[Display(Name = "客户编号")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string ClientId { get; set; }
[Display(Name = "描述")]
[JsonProperty, Column(StringLength = -2)]
public string Description { get; set; }
[Display(Name = "创建时间")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string CreationTime { get; set; }
[Display(Name = "到期")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Expiration { get; set; }
[DisplayName("数据")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Data { get; set; }
}
}

View File

@ -0,0 +1,49 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 密钥
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class Keys
{
[DisplayName("ID")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string Id { get; set; }
[DisplayName("版本")]
[JsonProperty]
public int Version { get; set; }
[DisplayName("创建")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Created { get; set; }
[DisplayName("使用")]
[JsonProperty, Column(StringLength = -2)]
public string Use { get; set; }
[DisplayName("算法")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Algorithm { get; set; }
[DisplayName("是X509证书")]
[JsonProperty]
public int IsX509Certificate { get; set; }
[DisplayName("数据保护")]
[JsonProperty]
public int DataProtected { get; set; }
[DisplayName("数据")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Data { get; set; }
}
}

View File

@ -0,0 +1,57 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System.ComponentModel;
#nullable disable
namespace Densen.Models.ids
{
/// <summary>
/// 持久化保存
/// </summary>
[JsonObject(MemberSerialization.OptIn), Table(DisableSyncStructure = true)]
public partial class PersistedGrants
{
[DisplayName("键值")]
[JsonProperty, Column(StringLength = -2, IsPrimary = true, IsNullable = false)]
public string Key { get; set; }
[DisplayName("类型")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Type { get; set; }
[DisplayName("主题编号")]
[JsonProperty, Column(StringLength = -2)]
public string SubjectId { get; set; }
[DisplayName("会话编号")]
[JsonProperty, Column(StringLength = -2)]
public string SessionId { get; set; }
[DisplayName("客户编号")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string ClientId { get; set; }
[DisplayName("描述")]
[JsonProperty, Column(StringLength = -2)]
public string Description { get; set; }
[DisplayName("创建时间")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string CreationTime { get; set; }
[DisplayName("到期")]
[JsonProperty, Column(StringLength = -2)]
public string Expiration { get; set; }
[DisplayName("消耗时间")]
[JsonProperty, Column(StringLength = -2)]
public string ConsumedTime { get; set; }
[DisplayName("数据")]
[JsonProperty, Column(StringLength = -2, IsNullable = false)]
public string Data { get; set; }
}
}

View File

@ -0,0 +1,53 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Densen.Identity.Models
{
public class WebAppIdentityUser
{
/// <summary>
/// Full name
/// </summary>
[Display(Name = "全名")]
public string? Name { get; set; }
/// <summary>
/// Birth Date
/// </summary>
[Display(Name = "生日")]
public DateTime? DOB { get; set; }
[Display(Name = "识别码")]
public string? UUID { get; set; }
[Display(Name = "外联")]
public string? provider { get; set; }
[Display(Name = "税号")]
public string? TaxNumber { get; set; }
[Display(Name = "街道地址")]
public string? Street { get; set; }
[Display(Name = "邮编")]
public string? Zip { get; set; }
[Display(Name = "县")]
public string? County { get; set; }
[Display(Name = "城市")]
public string? City { get; set; }
[Display(Name = "省份")]
public string? Province { get; set; }
[Display(Name = "国家")]
public string? Country { get; set; }
[Display(Name = "类型")]
public string? UserRole { get; set; }
}
}

Binary file not shown.

View File

@ -0,0 +1,79 @@
using FreeSql;
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class UserGroup : BaseEntity<UserGroup, int>
{
/// <summary>
/// 组名
/// </summary>
public string GroupName { get; set; }
public List<User1> User1s { get; set; }
}
public class Role : BaseEntity<Role, string>
{
public List<User1> User1s { get; set; }
}
public class RoleUser1 : BaseEntity<RoleUser1>
{
public string RoleId { get; set; }
public Guid User1Id { get; set; }
public Role Role { get; set; }
public User1 User1 { get; set; }
}
public class IdentityUser1
{
[Column(IsIdentity = true)]
public int Id { get; set; }
[MaxLength(32)]
public string Username { get; set; }
[MaxLength(64), Column(InsertValueSql = "'defaultname'")]
public string Nickname { get; set; }
}
public class User1 : BaseEntity<User1, Guid>
{
public int GroupId { get; set; }
public UserGroup Group { get; set; }
public string[] Tags { get; set; }
public virtual List<Role> Roles { get; set; }
/// <summary>
/// 登陆名
/// </summary>
[MaxLength(32)]
public string Username { get; set; }
/// <summary>
/// 昵称
/// </summary>
[MaxLength(64)]
public string Nickname { get; set; }
/// <summary>
/// 头像
/// </summary>
[MaxLength(1024)]
public string Avatar { get; set; }
/// <summary>
/// 描述
/// </summary>
[MaxLength(2000)]
public string Description { get; set; }
}
public class IdentityTable
{
[Column(IsIdentity = true, IsPrimary = true)]
public int id { get; set; }
public string name { get; set; }
}

View File

@ -0,0 +1,104 @@
using FreeSql.DataAnnotations;
using MessagePack;
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading;
class MessagePackMapInfo
{
public Guid id { get; set; }
[MessagePackMap]
public MessagePackMap01 Info { get; set; }
}
[MessagePackObject]
public class MessagePackMap01
{
[Key(0)]
public string name { get; set; }
[Key(1)]
public string address { get;set; }
}
namespace FreeSql.DataAnnotations
{
public class MessagePackMapAttribute : Attribute { }
}
public static class FreeSqlMessagePackMapCoreExtensions
{
internal static int _isAoped = 0;
static ConcurrentDictionary<Type, bool> _dicTypes = new ConcurrentDictionary<Type, bool>();
static MethodInfo MethodMessagePackSerializerDeserialize = typeof(MessagePackSerializer).GetMethod("Deserialize", new[] { typeof(Type), typeof(ReadOnlyMemory<byte>), typeof(MessagePackSerializerOptions), typeof(CancellationToken) });
static MethodInfo MethodMessagePackSerializerSerialize = typeof(MessagePackSerializer).GetMethod("Serialize", new[] { typeof(Type), typeof(object), typeof(MessagePackSerializerOptions), typeof(CancellationToken) });
static ConcurrentDictionary<Type, ConcurrentDictionary<string, bool>> _dicMessagePackMapFluentApi = new ConcurrentDictionary<Type, ConcurrentDictionary<string, bool>>();
static object _concurrentObj = new object();
public static ColumnFluent MessagePackMap(this ColumnFluent col)
{
_dicMessagePackMapFluentApi.GetOrAdd(col._entityType, et => new ConcurrentDictionary<string, bool>())
.GetOrAdd(col._property.Name, pn => true);
return col;
}
public static void UseMessagePackMap(this IFreeSql that)
{
UseMessagePackMap(that, MessagePackSerializerOptions.Standard);
}
public static void UseMessagePackMap(this IFreeSql that, MessagePackSerializerOptions settings)
{
if (Interlocked.CompareExchange(ref _isAoped, 1, 0) == 0)
{
FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) =>
{
if (_dicTypes.ContainsKey(type))
return Expression.IfThenElse(
Expression.TypeIs(valueExp, type),
Expression.Return(returnTarget, valueExp),
Expression.Return(returnTarget, Expression.TypeAs(
Expression.Call(MethodMessagePackSerializerDeserialize,
Expression.Constant(type),
Expression.New(typeof(ReadOnlyMemory<byte>).GetConstructor(new[] { typeof(byte[]) }), Expression.Convert(valueExp, typeof(byte[]))),
Expression.Constant(settings, typeof(MessagePackSerializerOptions)),
Expression.Constant(default(CancellationToken), typeof(CancellationToken)))
, type))
);
return null;
});
}
that.Aop.ConfigEntityProperty += (s, e) =>
{
var isMessagePackMap = e.Property.GetCustomAttributes(typeof(MessagePackMapAttribute), false).Any() || _dicMessagePackMapFluentApi.TryGetValue(e.EntityType, out var tryjmfu) && tryjmfu.ContainsKey(e.Property.Name);
if (isMessagePackMap)
{
e.ModifyResult.MapType = typeof(byte[]);
e.ModifyResult.StringLength = -2;
if (_dicTypes.TryAdd(e.Property.PropertyType, true))
{
lock (_concurrentObj)
{
FreeSql.Internal.Utils.dicExecuteArrayRowReadClassOrTuple[e.Property.PropertyType] = true;
FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionObjectToBytesIfThenElse.Add((LabelTarget returnTarget, Expression valueExp, Expression elseExp, Type type) =>
{
return Expression.IfThenElse(
Expression.TypeIs(valueExp, e.Property.PropertyType),
Expression.Return(returnTarget,
Expression.Call(MethodMessagePackSerializerSerialize,
Expression.Constant(e.Property.PropertyType, typeof(Type)),
Expression.Convert(valueExp, typeof(object)),
Expression.Constant(settings, typeof(MessagePackSerializerOptions)),
Expression.Constant(default(CancellationToken), typeof(CancellationToken)))
, typeof(object)),
elseExp);
});
}
}
}
};
}
}

View File

@ -0,0 +1,54 @@
using FreeSql;
using FreeSql.DataAnnotations;
using FreeSql.Internal;
using FreeSql.Internal.Model;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
class ModAsTableImpl : IAsTable
{
public ModAsTableImpl(IFreeSql fsql)
{
AllTables = Enumerable.Range(0, 9).Select(a => $"order_{a}").ToArray();
fsql.Aop.CommandBefore += (_, e) =>
{
e.Command.CommandText = Regex.Replace(e.Command.CommandText, @"/\*astable\([^\)]+\)*\/", "1=1");
};
}
public string[] AllTables { get; }
public string GetTableNameByColumnValue(object columnValue, bool autoExpand = false)
{
var modid = (int)columnValue;
return $"order_{(modid % 10)}";
}
public string[] GetTableNamesByColumnValueRange(object columnValue1, object columnValue2)
{
throw new NotImplementedException();
}
public IAsTableTableNameRangeResult GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils)
{
var match = Regex.Match(sqlWhere, @"/\*astable\([^\)]+\)*\/");
if (match.Success == false) return new IAsTableTableNameRangeResult(AllTables, null, null);
var tables = match.Groups[1].Value.Split(',').Where(a => AllTables.Contains(a)).ToArray();
if (tables.Any() == false) return new IAsTableTableNameRangeResult(AllTables, null, null);
return new IAsTableTableNameRangeResult(tables, null, null);
}
public IAsTable SetDefaultAllTables(Func<string[], string[]> audit)
{
throw new NotImplementedException();
}
public IAsTable SetTableName(int index, string tableName)
{
throw new NotImplementedException();
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using FreeSql.DataAnnotations;
using FreeSql;
namespace EMSServerModel.Model
{
/// <summary>
/// <20><>ɫ<EFBFBD><C9AB>
/// </summary>
[JsonObject(MemberSerialization.OptIn)]
public partial class Role : BaseEntity<Role>{
/// <summary>
/// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
/// </summary>
[JsonProperty, Column(IsPrimary = true, IsIdentity = true)]
public long RoleId { get; set; }
/// <summary>
/// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string RoleName { get; set; } = string.Empty;
/// <summary>
/// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string RoleDesc { get; set; } = string.Empty;
///// <summary>
///// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
///// </summary>
//[JsonProperty, Column(DbType = "date")]
//public DateTime CreateTime { get; set; } = DateTime.Now;
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
[JsonProperty]
public bool IsEnable { get; set; } = true;
/// <summary>
/// <20><>ɫ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Զർ<D4B6><E0B5BC>
/// </summary>
[Navigate(ManyToMany = typeof(UserRole))]
public virtual ICollection<User> Users { get; protected set; }
}
}

View File

@ -0,0 +1,157 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using FreeSql.DataAnnotations;
using System.ComponentModel.DataAnnotations;
using FreeSql;
namespace EMSServerModel.Model
{
/// <summary>
/// 用户表bb123123
/// </summary>
[JsonObject(MemberSerialization.OptIn)]
public partial class User : BaseEntity<User> {
//[JsonProperty, Column(IsIdentity = true)]
//public long Id { get; set; }
/// <summary>
/// 编号
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)", IsPrimary = true)]
public string UserId { get; set; } = string.Empty;
/// <summary>
/// 头像
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string Avatar { get; set; } = string.Empty;
/// <summary>
/// 姓名
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string UserName { get; set; } = string.Empty;
/// <summary>
/// 艺名
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string NickName { get; set; } = string.Empty;
/// <summary>
/// 电话
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string Tel { get; set; } = string.Empty;
/// <summary>
/// 性别
/// </summary>
[JsonProperty]
public Sex Sex { get; set; } = Sex.;
/// <summary>
/// 证件号
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string UID { get; set; } = string.Empty;
/// <summary>
/// 生日
/// </summary>
[JsonProperty, Column(DbType = "date")]
public DateTime? DateOfBirth { get; set; }
/// <summary>
/// 出生地
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string PlaceOfBirth { get; set; } = string.Empty;
/// <summary>
/// 居住地
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string Addr { get; set; } = string.Empty;
/// <summary>
/// 密码
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string Pwd { get; set; } = string.Empty;
/// <summary>
/// 部门编号
/// </summary>
[JsonProperty]
public long? DeptId { get; set; }
/// <summary>
/// 职务编号
/// </summary>
[JsonProperty, Column(IsNullable = true)]
public long TitleId { get; set; }
[JsonProperty]
public long TitleId2 { get; set; }
///// <summary>
///// 创建时间
///// </summary>
//[JsonProperty, Column(DbType = "date")]
//public DateTime CreateTime { get; set; } = DateTime.Now;
/// <summary>
/// 国籍
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string Nationality { get; set; } = string.Empty;
/// <summary>
/// 经手人
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string Handler { get; set; } = string.Empty;
/// <summary>
/// 启用
/// </summary>
[JsonProperty]
public bool IsEnable { get; set; } = true;
/// <summary>
/// 备注
/// </summary>
[JsonProperty, Column(DbType = "varchar(100)")]
public string Memos { get; set; }
/// <summary>
///
/// </summary>
[Navigate(ManyToMany = typeof(UserRole))]
public virtual ICollection<Role> Roles { get; protected set; }
}
/// <summary>
/// 性别枚举
/// </summary>
public enum Sex
{
/// <summary>
/// 女=0
/// </summary>
=0,
/// <summary>
/// 男=1
/// </summary>
=1
}
}

View File

@ -0,0 +1,36 @@
using Newtonsoft.Json;
using FreeSql.DataAnnotations;
using FreeSql;
namespace EMSServerModel.Model
{
/// <summary>
/// <20>û<EFBFBD><C3BB><EFBFBD>ɫ<EFBFBD><C9AB>ϵ<EFBFBD><CFB5>aa111
/// </summary>
[JsonObject(MemberSerialization.OptIn)]
public partial class UserRole : BaseEntity<UserRole>{
/// <summary>
/// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>1
/// </summary>
[JsonProperty]
public long RoleId { get; set; }
/// <summary>
/// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
/// </summary>
[Navigate("RoleId")]
public Role Roles { get; set; }
/// <summary>
/// <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
[JsonProperty, Column(DbType = "varchar(50)")]
public string UserId { get; set; }
/// <summary>
/// <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
[Navigate("UserId")]
public User Users { get; set; }
}
}

View File

@ -0,0 +1,52 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>base_entity.xml</DocumentationFile>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;1591</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Confluent.Kafka" Version="2.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Npgsql.NetTopologySuite" Version="6.0.4" />
<PackageReference Include="MessagePack" Version="2.4.35" />
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.AggregateRoot\FreeSql.Extensions.AggregateRoot.csproj" />
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.BaseEntity\FreeSql.Extensions.BaseEntity.csproj" />
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.JsonMap\FreeSql.Extensions.JsonMap.csproj" />
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" />
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.Linq\FreeSql.Extensions.Linq.csproj" />
<ProjectReference Include="..\..\FreeSql.Repository\FreeSql.Repository.csproj" />
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.ClickHouse\FreeSql.Provider.ClickHouse.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Dameng\FreeSql.Provider.Dameng.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Firebird\FreeSql.Provider.Firebird.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.MySqlConnector\FreeSql.Provider.MySqlConnector.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Odbc\FreeSql.Provider.Odbc.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Oracle\FreeSql.Provider.Oracle.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.PostgreSQL\FreeSql.Provider.PostgreSQL.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.QuestDb\FreeSql.Provider.QuestDb.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.SqliteCore\FreeSql.Provider.SqliteCore.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Xugu\FreeSql.Provider.Xugu.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="DmProvider">
<HintPath>..\..\Providers\FreeSql.Provider.Dameng\lib\DmProvider\netstandard2.0\DmProvider.dll</HintPath>
</Reference>
<Reference Include="XuguClient">
<HintPath>..\..\Providers\FreeSql.Provider.Xugu\lib\XuguClient\netstandard2.0\XuguClient.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -0,0 +1,500 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>base_entity</name>
</assembly>
<members>
<member name="T:Densen.Models.ids.AspNetRoleClaims">
<summary>
角色声明
</summary>
</member>
<member name="T:Densen.Models.ids.AspNetRoles">
<summary>
角色定义
</summary>
</member>
<member name="T:Densen.Models.ids.AspNetUserClaims">
<summary>
用户声明
</summary>
</member>
<member name="P:Densen.Models.ids.AspNetUserClaims.AspNetUsers">
<summary>
用户
</summary>
</member>
<member name="T:Densen.Models.ids.AspNetUserLogins">
<summary>
用户登录
</summary>
</member>
<member name="P:Densen.Models.ids.AspNetUserLogins.AspNetUsers">
<summary>
用户
</summary>
</member>
<member name="T:Densen.Models.ids.AspNetUserRoles">
<summary>
角色表
<para>存储向哪些用户分配哪些角色</para>
</summary>
</member>
<member name="T:Densen.Models.ids.AspNetUsers">
<summary>
用户表
</summary>
</member>
<member name="T:Densen.Models.ids.AspNetUserTokens">
<summary>
用户令牌
</summary>
</member>
<member name="T:Densen.Models.ids.DeviceCodes">
<summary>
设备代码
</summary>
</member>
<member name="T:Densen.Models.ids.Keys">
<summary>
密钥
</summary>
</member>
<member name="T:Densen.Models.ids.PersistedGrants">
<summary>
持久化保存
</summary>
</member>
<member name="P:Densen.Identity.Models.WebAppIdentityUser.Name">
<summary>
Full name
</summary>
</member>
<member name="P:Densen.Identity.Models.WebAppIdentityUser.DOB">
<summary>
Birth Date
</summary>
</member>
<member name="P:UserGroup.GroupName">
<summary>
组名
</summary>
</member>
<member name="P:User1.Username">
<summary>
登陆名
</summary>
</member>
<member name="P:User1.Nickname">
<summary>
昵称
</summary>
</member>
<member name="P:User1.Avatar">
<summary>
头像
</summary>
</member>
<member name="P:User1.Description">
<summary>
描述
</summary>
</member>
<member name="T:base_entity.Program.TUserImg">
<summary>
用户图片2
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.Id">
<summary>
主键
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.EnterpriseId">
<summary>
企业
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.UserId">
<summary>
用户id
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.Img">
<summary>
图片
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.CId">
<summary>
创建人Id
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.CName">
<summary>
创建人
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.CTime">
<summary>
创建日期
</summary>
</member>
<member name="P:base_entity.Program.TUserImg.CTime2">
<summary>
创建日期2
</summary>
</member>
<member name="P:base_entity.Program.IDeleteSoft.IsDeleted">
<summary>
软删除
</summary>
</member>
<member name="P:base_entity.抖店实时销售金额表.ID">
<summary>
ID
</summary>
</member>
<member name="P:base_entity.抖店实时销售金额表.店铺名称">
<summary>
店铺名称
</summary>
</member>
<member name="P:base_entity.抖店实时销售金额表.日期">
<summary>
日期
</summary>
</member>
<member name="P:base_entity.抖店实时销售金额表.品牌名称">
<summary>
品牌名称
</summary>
</member>
<member name="P:base_entity.抖店实时销售金额表.成交金额">
<summary>
成交金额
</summary>
</member>
<member name="P:base_entity.抖店实时销售金额表.更新时间">
<summary>
更新时间
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.Id">
<summary>
主键标识
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.MchtAppId">
<summary>
商户应用Id
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.Describe">
<summary>
描述
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.Status">
<summary>
状态0、关闭 1、启用
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.IsLimitUsePoints">
<summary>
是否限制使用积分0、否 1、是
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.StartTime">
<summary>
开始时间
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.EndTime">
<summary>
结束时间
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.CreatedBy">
<summary>
创建人Id
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.UpdatedBy">
<summary>
最后编辑人Id
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.UpdatedTime">
<summary>
最后编辑时间
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.Deleted">
<summary>
是否删除0、否 1、是
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.DeletedBy">
<summary>
删除人Id
</summary>
</member>
<member name="P:base_entity.MarketingRestrictions.DeletedTime">
<summary>
删除时间
</summary>
</member>
<member name="P:base_entity.CurrentDetail.RecordDate">
<summary>
创建日期
</summary>
</member>
<member name="P:base_entity.CurrentDetail.RecordHour">
<summary>
创建小时
</summary>
</member>
<member name="P:base_entity.CurrentDetail.RecordMinute">
<summary>
根据当前分钟数规整到10分钟的倍数
例如 21分=>20分
</summary>
</member>
<member name="P:base_entity.CurrentDetail.RecordTime">
<summary>
记录时间
</summary>
</member>
<member name="P:base_entity.CurrentDetail.DeviceCode">
<summary>
设备Code
</summary>
</member>
<member name="P:base_entity.CurrentDetail.TerminalSequence">
<summary>
控制器序列号
</summary>
</member>
<member name="P:base_entity.CurrentDetail.AvgValue">
<summary>
平均值
</summary>
</member>
<member name="P:base_entity.CurrentDetail.RouteNum">
<summary>
路数
</summary>
</member>
<member name="P:base_entity.CurrentDetail.PhaseTypeId">
<summary>
相类型
</summary>
</member>
<member name="P:base_entity.ProducerModel_Kafka.Sender">
<summary>
这个可以
</summary>
</member>
<member name="P:base_entity.ProducerModel_Kafka.ID">
<summary>
ID
</summary>
</member>
<member name="P:base_entity.ProducerModel_Kafka.IP">
<summary>
IP
</summary>
</member>
<member name="P:base_entity.ProducerModel_Kafka.PConfig">
<summary>
这个不行
</summary>
</member>
<member name="P:ProjectItem.Code">
<summary>
编码
</summary>
</member>
<member name="P:ProjectItem.MaxQuantity">
<summary>
实际最大用量
</summary>
</member>
<member name="P:ProjectItem.Name">
<summary>
名称
</summary>
</member>
<member name="T:EMSServerModel.Model.Role">
<summary>
角色表
</summary>
</member>
<member name="P:EMSServerModel.Model.Role.RoleId">
<summary>
角色编号
</summary>
</member>
<member name="P:EMSServerModel.Model.Role.RoleName">
<summary>
角色名称
</summary>
</member>
<member name="P:EMSServerModel.Model.Role.RoleDesc">
<summary>
角色描述
</summary>
</member>
<member name="P:EMSServerModel.Model.Role.IsEnable">
<summary>
启用
</summary>
</member>
<member name="P:EMSServerModel.Model.Role.Users">
<summary>
角色用户多对多导航
</summary>
</member>
<member name="T:EMSServerModel.Model.User">
<summary>
用户表bb123123
</summary>
</member>
<member name="P:EMSServerModel.Model.User.UserId">
<summary>
编号
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Avatar">
<summary>
头像
</summary>
</member>
<member name="P:EMSServerModel.Model.User.UserName">
<summary>
姓名
</summary>
</member>
<member name="P:EMSServerModel.Model.User.NickName">
<summary>
艺名
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Tel">
<summary>
电话
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Sex">
<summary>
性别
</summary>
</member>
<member name="P:EMSServerModel.Model.User.UID">
<summary>
证件号
</summary>
</member>
<member name="P:EMSServerModel.Model.User.DateOfBirth">
<summary>
生日
</summary>
</member>
<member name="P:EMSServerModel.Model.User.PlaceOfBirth">
<summary>
出生地
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Addr">
<summary>
居住地
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Pwd">
<summary>
密码
</summary>
</member>
<member name="P:EMSServerModel.Model.User.DeptId">
<summary>
部门编号
</summary>
</member>
<member name="P:EMSServerModel.Model.User.TitleId">
<summary>
职务编号
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Nationality">
<summary>
国籍
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Handler">
<summary>
经手人
</summary>
</member>
<member name="P:EMSServerModel.Model.User.IsEnable">
<summary>
启用
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Memos">
<summary>
备注
</summary>
</member>
<member name="P:EMSServerModel.Model.User.Roles">
<summary>
</summary>
</member>
<member name="T:EMSServerModel.Model.Sex">
<summary>
性别枚举
</summary>
</member>
<member name="F:EMSServerModel.Model.Sex.女">
<summary>
女=0
</summary>
</member>
<member name="F:EMSServerModel.Model.Sex.男">
<summary>
男=1
</summary>
</member>
<member name="T:EMSServerModel.Model.UserRole">
<summary>
用户角色关系表aa111
</summary>
</member>
<member name="P:EMSServerModel.Model.UserRole.RoleId">
<summary>
角色编号1
</summary>
</member>
<member name="P:EMSServerModel.Model.UserRole.Roles">
<summary>
角色导航
</summary>
</member>
<member name="P:EMSServerModel.Model.UserRole.UserId">
<summary>
用户编号
</summary>
</member>
<member name="P:EMSServerModel.Model.UserRole.Users">
<summary>
用户导航
</summary>
</member>
</members>
</doc>

View File

@ -0,0 +1,25 @@
using FreeSql.DataAnnotations;
using NetTopologySuite.Geometries;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace base_entity
{
partial class Program
{
public static void test_pgsql(IFreeSql fsql)
{
var ddl = fsql.CodeFirst.GetComparisonDDLStatements<gistIndex>();
}
}
[Index("sidx_zjds_geom", nameof(Geom), IndexMethod = IndexMethod.GiST)]
class gistIndex
{
public int bb { get; set; }
public LineString Geom { get; set; }
}
}

View File

@ -0,0 +1,130 @@
# 前言
尝试过 ado.net、dapper、ef以及Repository仓储甚至自己还写过生成器工具以便做常规CRUD操作。
它们日常操作不方便之处:
- 每次使用前需要声明,再操作;
- 很多人一个实体类对应一个操作类或DAL、DbContext、Repository
BaseEntity 是一种极简单的 CodeFirst 开发方式特别对单表或多表CRUD利用继承节省了每个实体类的重复属性创建时间、ID等字段软件删除等功能进行 crud 操作时不必时常考虑仓储的使用;
本文介绍 BaseEntity 一种极简约的 CRUD 操作方法。
# 功能特点
- 自动迁移实体结构CodeFirst到数据库
- 直接操作实体的方法,进行 CRUD 操作;
- 简化用户定义实体类型省去主键、常用字段的配置如CreateTime、UpdateTime
- 实现单表、多表查询的软删除逻辑;
# 声明
> dotnet add package FreeSql.Extensions.BaseEntity
> dotnet add package FreeSql.Provider.Sqlite
```csharp
BaseEntity.Initialization(fsql, null);
```
1、定义一个主键 int 并且自增的实体类型BaseEntity TKey 指定为 int/long 时,会认为主键是自增;
```csharp
public class UserGroup : BaseEntity<UserGroup, int>
{
public string GroupName { get; set; }
}
```
如果不想主键是自增键,可以重写属性:
```csharp
public class UserGroup : BaseEntity<UserGroup, int>
{
[Column(IsIdentity = false)]
public override int Id { get; set; }
public string GroupName { get; set; }
}
```
> 有关更多实体的特性配置请参考资料https://github.com/2881099/FreeSql/wiki/%e5%ae%9e%e4%bd%93%e7%89%b9%e6%80%a7
2、定义一个主键 Guid 的实体类型,保存数据时会自动产生有序不重复的 Guid 值(不用自己指定 Guid.NewGuid()
```csharp
public class User : BaseEntity<UserGroup, Guid>
{
public string UserName { get; set; }
}
```
# CRUD 使用
```csharp
//添加
var item = new UserGroup { GroupName = "组一" };
item.Insert();
//更新
item.GroupName = "组二";
item.Update();
//添加或更新
item.Save();
//软删除
item.Delete();
//恢复软删除
item.Restore();
//根据主键获取对象
var item = UserGroup.Find(1);
//查询数据
var items = UserGroup.Where(a => a.Id > 10).ToList();
```
实体类型.Select 是一个查询对象,使用方法和 FreeSql.ISelect 一样;
支持多表查询时,软删除条件会附加在每个表中;
> 有关更多查询方法请参考资料https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2
# 事务建议
由于 AsyncLocal 平台兼容不好,所以交给外部管理事务。
```csharp
static AsyncLocal<IUnitOfWork> _asyncUow = new AsyncLocal<IUnitOfWork>();
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
```
在 Scoped 开始时: _asyncUow.Value = fsql.CreateUnitOfWork(); (也可以使用 UnitOfWorkManager 对象获取 uow)
在 Scoped 结束时_asyncUow.Value = null;
如下:
```csharp
using (var uow = fsql.CreateUnitOfWork())
{
_asyncUow.Value = uow;
try
{
//todo ... BaseEntity 内部 curd 方法保持使用 uow 事务
}
finally
{
_asyncUow.Value = null;
}
uow.Commit();
}
```