- 增加 FreeSqlBuilder UseSeedData 设定 CodeFirst 种子数据;

This commit is contained in:
28810 2020-04-02 16:21:18 +08:00
parent 6ea5c5d103
commit e5cbd407cb
8 changed files with 222 additions and 243 deletions

View File

@ -65,7 +65,24 @@ namespace base_entity
//.UseConnectionString(FreeSql.DataType.OdbcOracle, "Driver={Oracle in XE};Server=//127.0.0.1:1521/XE;Persist Security Info=False;Trusted_Connection=Yes;UID=odbc1;PWD=123456") //.UseConnectionString(FreeSql.DataType.OdbcOracle, "Driver={Oracle in XE};Server=//127.0.0.1:1521/XE;Persist Security Info=False;Trusted_Connection=Yes;UID=odbc1;PWD=123456")
//.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
.UseConnectionString(FreeSql.DataType.OdbcDameng, "Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789") //.UseConnectionString(FreeSql.DataType.OdbcDameng, "Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789")
.UseMonitorCommand(cmd => Console.Write(cmd.CommandText))
.UseSeedData(sd => sd
.Apply(new[]
{
new Products { Id = 1, title = "product-1" },
new Products { Id = 2, title = "product-2" },
new Products { Id = 3, title = "product-3" },
new Products { Id = 4, title = "product-4" }
})
.Apply(new[]
{
new S_SysConfig<TestConfig> { Name = "testkey11", Config = new TestConfig { clicks = 11, title = "testtitle11" } },
new S_SysConfig<TestConfig> { Name = "testkey22", Config = new TestConfig { clicks = 22, title = "testtitle22" } },
new S_SysConfig<TestConfig> { Name = "testkey33", Config = new TestConfig { clicks = 33, title = "testtitle33" } }
})
)
.UseLazyLoading(true) .UseLazyLoading(true)
.Build(); .Build();

View File

@ -25,8 +25,7 @@ namespace FreeSql
{ {
var tkeyType = typeof(TKey)?.NullableTypeOrThis(); var tkeyType = typeof(TKey)?.NullableTypeOrThis();
if (tkeyType == typeof(int) || tkeyType == typeof(long)) if (tkeyType == typeof(int) || tkeyType == typeof(long))
Orm.CodeFirst.ConfigEntity(typeof(TEntity), BaseEntity.ConfigEntity(typeof(TEntity), t => t.Property("Id").IsIdentity(true));
t => t.Property("Id").IsIdentity(true));
} }
/// <summary> /// <summary>

View File

@ -21,8 +21,7 @@ namespace FreeSql
{ {
var tkeyType = typeof(TKey)?.NullableTypeOrThis(); var tkeyType = typeof(TKey)?.NullableTypeOrThis();
if (tkeyType == typeof(int) || tkeyType == typeof(long)) if (tkeyType == typeof(int) || tkeyType == typeof(long))
Orm.CodeFirst.ConfigEntity(typeof(TEntity), BaseEntity.ConfigEntity(typeof(TEntity), t => t.Property("Id").IsIdentity(true));
t => t.Property("Id").IsIdentity(true));
} }
/// <summary> /// <summary>

View File

@ -4,6 +4,7 @@ using FreeSql.DataAnnotations;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Data; using System.Data;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
@ -18,7 +19,7 @@ namespace FreeSql
[Table(DisableSyncStructure = true)] [Table(DisableSyncStructure = true)]
public abstract class BaseEntity public abstract class BaseEntity
{ {
static IFreeSql _ormPriv; internal static IFreeSql _ormPriv;
/// <summary> /// <summary>
/// 全局 IFreeSql orm 对象 /// 全局 IFreeSql orm 对象
/// </summary> /// </summary>
@ -42,6 +43,32 @@ namespace FreeSql
{ {
_ormPriv = fsql; _ormPriv = fsql;
_ormPriv.Aop.CurdBefore += (s, e) => Trace.WriteLine($"\r\n线程{Thread.CurrentThread.ManagedThreadId}: {e.Sql}\r\n"); _ormPriv.Aop.CurdBefore += (s, e) => Trace.WriteLine($"\r\n线程{Thread.CurrentThread.ManagedThreadId}: {e.Sql}\r\n");
if (_configEntityQueues.Any())
{
lock (_configEntityLock)
{
while (_configEntityQueues.TryDequeue(out var cei))
_ormPriv.CodeFirst.ConfigEntity(cei.EntityType, cei.Fluent);
}
}
}
class ConfigEntityInfo
{
public Type EntityType;
public Action<TableFluent> Fluent;
}
static ConcurrentQueue<ConfigEntityInfo> _configEntityQueues = new ConcurrentQueue<ConfigEntityInfo>();
static object _configEntityLock = new object();
internal static void ConfigEntity(Type entityType, Action<TableFluent> fluent)
{
lock (_configEntityLock)
{
if (_ormPriv == null)
_configEntityQueues.Enqueue(new ConfigEntityInfo { EntityType = entityType, Fluent = fluent });
else
_ormPriv.CodeFirst.ConfigEntity(entityType, fluent);
}
} }
/// <summary> /// <summary>

View File

@ -217,15 +217,6 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
<member name="P:FreeSql.IBaseRepository.Orm"> <member name="P:FreeSql.IBaseRepository.Orm">
<summary> <summary>
注意IFreeSql 属于顶级对象,事务无法自动传递。<para></para> 注意IFreeSql 属于顶级对象,事务无法自动传递。<para></para>

View File

@ -690,20 +690,6 @@
<param name="value">true:运行时检查自动同步结构, false:不同步结构</param> <param name="value">true:运行时检查自动同步结构, false:不同步结构</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.FreeSqlBuilder.UseSyncStructureToLower(System.Boolean)">
<summary>
转小写同步结构
</summary>
<param name="value">true:转小写, false:不转</param>
<returns></returns>
</member>
<member name="M:FreeSql.FreeSqlBuilder.UseSyncStructureToUpper(System.Boolean)">
<summary>
转大写同步结构
</summary>
<param name="value">true:转大写, false:不转</param>
<returns></returns>
</member>
<member name="M:FreeSql.FreeSqlBuilder.UseConfigEntityFromDbFirst(System.Boolean)"> <member name="M:FreeSql.FreeSqlBuilder.UseConfigEntityFromDbFirst(System.Boolean)">
<summary> <summary>
将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。<para></para> 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。<para></para>
@ -746,6 +732,36 @@
<param name="executed">执行后,可监视执行性能</param> <param name="executed">执行后,可监视执行性能</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.FreeSqlBuilder.UseNameConvert(FreeSql.Internal.NameConvertType)">
<summary>
实体类名 -> 数据库表名,命名转换(类名、属性名都生效)<para></para>
优先级小于 [Table(Name = "xxx")]、[Column(Name = "xxx")]
</summary>
<param name="convertType"></param>
<returns></returns>
</member>
<member name="M:FreeSql.FreeSqlBuilder.UseSeedData(System.Action{FreeSql.FreeSqlBuilder.SeedDataBuilder})">
<summary>
CodeFirst 初始化种子数据<para></para>
表数据为空时,创建设定的种子数据
</summary>
<param name="sd"></param>
<returns></returns>
</member>
<member name="M:FreeSql.FreeSqlBuilder.UseSyncStructureToLower(System.Boolean)">
<summary>
转小写同步结构
</summary>
<param name="value">true:转小写, false:不转</param>
<returns></returns>
</member>
<member name="M:FreeSql.FreeSqlBuilder.UseSyncStructureToUpper(System.Boolean)">
<summary>
转大写同步结构
</summary>
<param name="value">true:转大写, false:不转</param>
<returns></returns>
</member>
<member name="M:FreeSql.FreeSqlBuilder.UseEntityPropertyNameConvert(FreeSql.Internal.StringConvertType)"> <member name="M:FreeSql.FreeSqlBuilder.UseEntityPropertyNameConvert(FreeSql.Internal.StringConvertType)">
<summary> <summary>
自动转换实体属性名称 Entity Property -> Db Filed 自动转换实体属性名称 Entity Property -> Db Filed
@ -755,14 +771,6 @@
<param name="convertType"></param> <param name="convertType"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.FreeSqlBuilder.UseNameConvert(FreeSql.Internal.NameConvertType)">
<summary>
实体类名 -> 数据库表名,命名转换(类名、属性名都生效)<para></para>
优先级小于 [Table(Name = "xxx")]、[Column(Name = "xxx")]
</summary>
<param name="convertType"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDelete`1.WithTransaction(System.Data.Common.DbTransaction)"> <member name="M:FreeSql.IDelete`1.WithTransaction(System.Data.Common.DbTransaction)">
<summary> <summary>
指定事务对象 指定事务对象
@ -2309,137 +2317,6 @@
<param name="parms"></param> <param name="parms"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询若使用读写分离查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
</summary>
<param name="readerHander"></param>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.String,System.Object)">
<summary>
查询ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询
</summary>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object)">
<summary>
查询ExecuteArrayAsync("select * from user where age > ?age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询
</summary>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object)">
<summary>
查询ExecuteDataSetAsync("select * from user where age > ?age; select 2", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询
</summary>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object)">
<summary>
查询ExecuteDataTableAsync("select * from user where age > ?age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
在【主库】执行
</summary>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object)">
<summary>
在【主库】执行ExecuteNonQueryAsync("delete from user where age > ?age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
在【主库】执行
</summary>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object)">
<summary>
在【主库】执行ExecuteScalarAsync("select 1 from user where age > ?age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
执行SQL返回对象集合QueryAsync&lt;User&gt;("select * from user where age > ?age", new SqlParameter { ParameterName = "age", Value = 25 })
</summary>
<typeparam name="T"></typeparam>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object)">
<summary>
执行SQL返回对象集合QueryAsync&lt;User&gt;("select * from user where age > ?age", new { age = 25 })
</summary>
<typeparam name="T"></typeparam>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
执行SQL返回对象集合Query&lt;User&gt;("select * from user where age > ?age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
</summary>
<typeparam name="T1"></typeparam>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object)">
<summary>
执行SQL返回对象集合Query&lt;User&gt;("select * from user where age > ?age; select * from address", new { age = 25 })
</summary>
<typeparam name="T1"></typeparam>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="E:FreeSql.IAop.ParseExpression"> <member name="E:FreeSql.IAop.ParseExpression">
<summary> <summary>
可自定义解析表达式 可自定义解析表达式
@ -2963,12 +2840,6 @@
<param name="timeout">超时</param> <param name="timeout">超时</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.GetAsync">
<summary>
获取资源
</summary>
<returns></returns>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)"> <member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
<summary> <summary>
使用完毕后,归还资源 使用完毕后,归还资源
@ -3039,12 +2910,6 @@
</summary> </summary>
<param name="obj">资源对象</param> <param name="obj">资源对象</param>
</member> </member>
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnGetAsync(FreeSql.Internal.ObjectPool.Object{`0})">
<summary>
从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
</summary>
<param name="obj">资源对象</param>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})"> <member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})">
<summary> <summary>
归还对象给对象池的时候触发 归还对象给对象池的时候触发

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
@ -7,7 +8,7 @@ using FreeSql.Internal;
namespace FreeSql namespace FreeSql
{ {
public class FreeSqlBuilder public partial class FreeSqlBuilder
{ {
DataType _dataType; DataType _dataType;
string _masterConnectionString; string _masterConnectionString;
@ -79,28 +80,6 @@ namespace FreeSql
return this; return this;
} }
/// <summary> /// <summary>
/// 转小写同步结构
/// </summary>
/// <param name="value">true:转小写, false:不转</param>
/// <returns></returns>
[Obsolete("请使用 UseNameConvert(NameConvertType.ToLower),或者 fsql.CodeFirst.IsSyncStructureToLower = value")]
public FreeSqlBuilder UseSyncStructureToLower(bool value)
{
_isSyncStructureToLower = value;
return this;
}
/// <summary>
/// 转大写同步结构
/// </summary>
/// <param name="value">true:转大写, false:不转</param>
/// <returns></returns>
[Obsolete("请使用 UseNameConvert(NameConvertType.ToUpper),或者 fsql.CodeFirst.IsSyncStructureToUpper = value")]
public FreeSqlBuilder UseSyncStructureToUpper(bool value)
{
_isSyncStructureToUpper = value;
return this;
}
/// <summary>
/// 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。<para></para> /// 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。<para></para>
/// 本功能会影响 IFreeSql 首次访问的速度。<para></para> /// 本功能会影响 IFreeSql 首次访问的速度。<para></para>
/// 若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除 /// 若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除
@ -159,20 +138,6 @@ namespace FreeSql
return this; return this;
} }
/// <summary>
/// 自动转换实体属性名称 Entity Property -> Db Filed
/// <para></para>
/// *不会覆盖 [Column] 特性设置的Name
/// </summary>
/// <param name="convertType"></param>
/// <returns></returns>
[Obsolete("请使用 UseNameConvert 功能")]
public FreeSqlBuilder UseEntityPropertyNameConvert(StringConvertType convertType)
{
_entityPropertyConvertType = convertType;
return this;
}
/// <summary> /// <summary>
/// 实体类名 -> 数据库表名,命名转换(类名、属性名都生效)<para></para> /// 实体类名 -> 数据库表名,命名转换(类名、属性名都生效)<para></para>
/// 优先级小于 [Table(Name = "xxx")]、[Column(Name = "xxx")] /// 优先级小于 [Table(Name = "xxx")]、[Column(Name = "xxx")]
@ -276,32 +241,7 @@ namespace FreeSql
_aopCommandExecuted?.Invoke(e.Command, e.Log); _aopCommandExecuted?.Invoke(e.Command, e.Log);
}); });
//添加实体属性名全局AOP转换处理 this.EntityPropertyNameConvert(ret);
if (_entityPropertyConvertType != StringConvertType.None)
{
string PascalCaseToUnderScore(string str) => string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString()));
switch (_entityPropertyConvertType)
{
case StringConvertType.Lower:
ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToLower();
break;
case StringConvertType.Upper:
ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToUpper();
break;
case StringConvertType.PascalCaseToUnderscore:
ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name);
break;
case StringConvertType.PascalCaseToUnderscoreWithLower:
ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToLower();
break;
case StringConvertType.PascalCaseToUnderscoreWithUpper:
ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToUpper();
break;
default:
break;
}
}
//添加实体属性名全局AOP转换处理 //添加实体属性名全局AOP转换处理
if (_nameConvertType != NameConvertType.None) if (_nameConvertType != NameConvertType.None)
{ {
@ -362,9 +302,70 @@ namespace FreeSql
} }
} }
}); });
//SeedData
if (_seedData != null && _seedData._data.Any())
{
ret.Aop.SyncStructureAfter += new EventHandler<Aop.SyncStructureAfterEventArgs>((s, e) =>
{
if (string.IsNullOrEmpty(e.Sql)) return;
foreach (var et in e.EntityTypes)
{
if (_seedData._data.TryGetValue(et, out var sd) == false) continue;
if (sd.Any() == false) continue;
if (ret.Select<object>().AsType(et).Any()) continue;
ret.Insert<object>()
.AsType(et)
.NoneParameter()
.InsertIdentity()
.AppendData(sd.ToArray())
.ExecuteAffrows();
}
});
foreach (var sd in _seedData._data)
{
ret.CodeFirst.SyncStructure(sd.Key);
}
}
} }
return ret; return ret;
} }
public class SeedDataBuilder
{
internal Dictionary<Type, List<object>> _data = new Dictionary<Type, List<object>>();
public SeedDataBuilder Apply<T>(T data) where T : class
{
if (_data.TryGetValue(typeof(T), out var ds) == false)
_data.Add(typeof(T), ds = new List<object>());
ds.Add(data);
return this;
}
public SeedDataBuilder Apply<T>(T[] data) where T : class
{
return this.Apply(data as IEnumerable<T>);
}
public SeedDataBuilder Apply<T>(IEnumerable<T> data) where T : class
{
foreach (var d in data) this.Apply(d);
return this;
}
}
SeedDataBuilder _seedData;
/// <summary>
/// CodeFirst 初始化种子数据<para></para>
/// 表数据为空时,创建设定的种子数据
/// </summary>
/// <param name="sd"></param>
/// <returns></returns>
public FreeSqlBuilder UseSeedData(Action<SeedDataBuilder> sd)
{
_seedData = new SeedDataBuilder();
sd?.Invoke(_seedData);
return this;
}
} }
} }

View File

@ -0,0 +1,80 @@
using System;
using System.Data.Common;
using System.Linq;
using System.Reflection;
using FreeSql.DataAnnotations;
using FreeSql.Internal;
namespace FreeSql
{
partial class FreeSqlBuilder
{
/// <summary>
/// 转小写同步结构
/// </summary>
/// <param name="value">true:转小写, false:不转</param>
/// <returns></returns>
[Obsolete("请使用 UseNameConvert(NameConvertType.ToLower),或者 fsql.CodeFirst.IsSyncStructureToLower = value")]
public FreeSqlBuilder UseSyncStructureToLower(bool value)
{
_isSyncStructureToLower = value;
return this;
}
/// <summary>
/// 转大写同步结构
/// </summary>
/// <param name="value">true:转大写, false:不转</param>
/// <returns></returns>
[Obsolete("请使用 UseNameConvert(NameConvertType.ToUpper),或者 fsql.CodeFirst.IsSyncStructureToUpper = value")]
public FreeSqlBuilder UseSyncStructureToUpper(bool value)
{
_isSyncStructureToUpper = value;
return this;
}
/// <summary>
/// 自动转换实体属性名称 Entity Property -> Db Filed
/// <para></para>
/// *不会覆盖 [Column] 特性设置的Name
/// </summary>
/// <param name="convertType"></param>
/// <returns></returns>
[Obsolete("请使用 UseNameConvert 功能")]
public FreeSqlBuilder UseEntityPropertyNameConvert(StringConvertType convertType)
{
_entityPropertyConvertType = convertType;
return this;
}
void EntityPropertyNameConvert(IFreeSql fsql)
{
//添加实体属性名全局AOP转换处理
if (_entityPropertyConvertType != StringConvertType.None)
{
string PascalCaseToUnderScore(string str) => string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString()));
switch (_entityPropertyConvertType)
{
case StringConvertType.Lower:
fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToLower();
break;
case StringConvertType.Upper:
fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToUpper();
break;
case StringConvertType.PascalCaseToUnderscore:
fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name);
break;
case StringConvertType.PascalCaseToUnderscoreWithLower:
fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToLower();
break;
case StringConvertType.PascalCaseToUnderscoreWithUpper:
fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToUpper();
break;
default:
break;
}
}
}
}
}