mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-08-02 09:55:57 +08:00
initial commit
This commit is contained in:
36
Examples/base_entity/AspNetRoleClaims/AspNetRoleClaims.cs
Normal file
36
Examples/base_entity/AspNetRoleClaims/AspNetRoleClaims.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
39
Examples/base_entity/AspNetRoleClaims/AspNetRoles.cs
Normal file
39
Examples/base_entity/AspNetRoleClaims/AspNetRoles.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
39
Examples/base_entity/AspNetRoleClaims/AspNetUserClaims.cs
Normal file
39
Examples/base_entity/AspNetRoleClaims/AspNetUserClaims.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
39
Examples/base_entity/AspNetRoleClaims/AspNetUserLogins.cs
Normal file
39
Examples/base_entity/AspNetRoleClaims/AspNetUserLogins.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
45
Examples/base_entity/AspNetRoleClaims/AspNetUserRoles.cs
Normal file
45
Examples/base_entity/AspNetRoleClaims/AspNetUserRoles.cs
Normal 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; }
|
||||
|
||||
}
|
||||
|
||||
}
|
36
Examples/base_entity/AspNetRoleClaims/AspNetUserTokens.cs
Normal file
36
Examples/base_entity/AspNetRoleClaims/AspNetUserTokens.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
149
Examples/base_entity/AspNetRoleClaims/AspNetUsers.cs
Normal file
149
Examples/base_entity/AspNetRoleClaims/AspNetUsers.cs
Normal 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;
|
||||
|
||||
}
|
||||
}
|
53
Examples/base_entity/AspNetRoleClaims/DeviceCodes.cs
Normal file
53
Examples/base_entity/AspNetRoleClaims/DeviceCodes.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
49
Examples/base_entity/AspNetRoleClaims/Keys.cs
Normal file
49
Examples/base_entity/AspNetRoleClaims/Keys.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
57
Examples/base_entity/AspNetRoleClaims/PersistedGrants.cs
Normal file
57
Examples/base_entity/AspNetRoleClaims/PersistedGrants.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
53
Examples/base_entity/AspNetRoleClaims/WebAppIdentityUser.cs
Normal file
53
Examples/base_entity/AspNetRoleClaims/WebAppIdentityUser.cs
Normal 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; }
|
||||
}
|
||||
}
|
BIN
Examples/base_entity/AspNetRoleClaims/ids_api.db
Normal file
BIN
Examples/base_entity/AspNetRoleClaims/ids_api.db
Normal file
Binary file not shown.
79
Examples/base_entity/Entities/User.cs
Normal file
79
Examples/base_entity/Entities/User.cs
Normal 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; }
|
||||
}
|
104
Examples/base_entity/MessagePackMap.cs
Normal file
104
Examples/base_entity/MessagePackMap.cs
Normal 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
54
Examples/base_entity/ModAsTableImpl.cs
Normal file
54
Examples/base_entity/ModAsTableImpl.cs
Normal 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();
|
||||
}
|
||||
}
|
3312
Examples/base_entity/Program.cs
Normal file
3312
Examples/base_entity/Program.cs
Normal file
File diff suppressed because one or more lines are too long
52
Examples/base_entity/Test01/Role.cs
Normal file
52
Examples/base_entity/Test01/Role.cs
Normal 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; }
|
||||
|
||||
}
|
||||
|
||||
}
|
157
Examples/base_entity/Test01/User.cs
Normal file
157
Examples/base_entity/Test01/User.cs
Normal 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
|
||||
}
|
||||
|
||||
}
|
36
Examples/base_entity/Test01/UserRole.cs
Normal file
36
Examples/base_entity/Test01/UserRole.cs
Normal 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; }
|
||||
|
||||
}
|
||||
|
||||
}
|
52
Examples/base_entity/base_entity.csproj
Normal file
52
Examples/base_entity/base_entity.csproj
Normal 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>
|
500
Examples/base_entity/base_entity.xml
Normal file
500
Examples/base_entity/base_entity.xml
Normal 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>
|
25
Examples/base_entity/pgsql_test.cs
Normal file
25
Examples/base_entity/pgsql_test.cs
Normal 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; }
|
||||
}
|
||||
}
|
130
Examples/base_entity/readme.md
Normal file
130
Examples/base_entity/readme.md
Normal 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();
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user