-
Notifications
You must be signed in to change notification settings - Fork 767
Closed
Labels
Milestone
Description
您的功能请求与现有问题有关吗?请描述
实体注册时,有些实体配置或者实体属性配置的需求比较统一,例如:
- 所有实体添加一定规范的表前缀
- 所有实体的DateTime属性希望在存数据库时转换为UTC时间
- 希望生成数据库时将属性注释添加到表字段的描述信息中
- 其他的一些需求
如果逐个写代码配置,很繁琐,需要统一配置
描述您想要的解决方案
定义新接口IEntityBatchConfiguration
来接管这些配置
/// <summary>
/// 定义实体的批量配置功能
/// </summary>
[MultipleDependency]
public interface IEntityBatchConfiguration
{
/// <summary>
/// 配置指定的<see cref="IMutableEntityType"/>
/// </summary>
/// <param name="modelBuilder">模型构建器</param>
/// <param name="mutableEntityType">实体的<see cref="IMutableEntityType"/>类型</param>
void Configure(ModelBuilder modelBuilder, IMutableEntityType mutableEntityType);
}
实现示例:表前缀 TableNamePrefixConfiguration
/// <summary>
/// 表名前缀配置
/// </summary>
public class TableNamePrefixConfiguration : IEntityBatchConfiguration
{
/// <summary>
/// 配置指定的<see cref="IMutableEntityType"/>
/// </summary>
/// <param name="modelBuilder">模型构建器</param>
/// <param name="mutableEntityType">实体的<see cref="IMutableEntityType"/>类型</param>
public void Configure(ModelBuilder modelBuilder, IMutableEntityType mutableEntityType)
{
string prefix = GetTableNamePrefix(mutableEntityType.ClrType);
if (prefix.IsNullOrEmpty())
{
return;
}
string tableName = $"{prefix}_{mutableEntityType.GetTableName()}";
modelBuilder.Entity(mutableEntityType.ClrType).ToTable(tableName);
}
/// <summary>
/// 从实体类型获取表名前缀
/// </summary>
/// <param name="entityType">实体类型</param>
/// <returns></returns>
protected virtual string GetTableNamePrefix(Type entityType)
{
TableNamePrefixAttribute attribute = entityType.GetAttribute<TableNamePrefixAttribute>();
return attribute?.Prefix;
}
}
应用
services.AddSingleton<IEntityBatchConfiguration, TableNamePrefixConfiguration>();