在 EF Core 模型构建器中获取实体 class 的命名空间
Get namespace of entity class in EF Core model builder
我正在尝试建立一个 table 命名约定,以便 table 名称是命名空间和 class 的组合。例如
namespace Sales;
public class Order { }
将转换为 Sales_Order
的 table 名称。
我已经为个人解决了class
builder.ToTable($"{typeof(Order).Namespace}_{typeof(Order).Name}");
如果未明确设置 ToTable
,我想将其设置为所有 table 的默认值。
protected override void OnModelCreating(ModelBuilder builder)
{
foreach(var entityType in builder.Model.GetEntityTypes())
{
if(entityType.ClrType == null) { continue; }
{
string tableName = entityType.GetTableName();
string tableNamespace = entityType.GetType().Namespace;
entityType.SetTableName($"{tableNamespace}_{tableName}");
}
}
}
但我无法获取实体 class 的命名空间。它返回 Microsoft.EntityFrameworkCore.Metadata.Internal
我的实体将位于多个不同的 class 库中,因此我希望拦截并更改模型构建器中的名称。
关于如何从模型构建器中确定实体的命名空间有什么建议吗?
entityType.GetType()
是从 object
继承的 GetType
方法,因此它将 return IMutableEntityType
的基础类型(其集合是 return编辑 builder.Model.GetEntityTypes()
), 使用 entityType.ClrType
:
string tableNamespace = entityType.ClrType.Namespace;
这是最终的解决方案。
protected override void OnModelCreating(ModelBuilder builder)
{
foreach(var entityType in builder.Model.GetEntityTypes())
{
if (entityType.ClrType == null) { continue; }
string entityName = entityType.Name.Split(".").Last();
string tableName = entityType.GetTableName();
if (tableName == entityName)
{
entityType.SetTableName($"{entityType.Name.Replace(".", "_")}");
}
}
如果实体名称与 table 名称匹配,则应用约定。如果显式 ToTable
用于应用不同的名称,则会跳过约定。
我正在尝试建立一个 table 命名约定,以便 table 名称是命名空间和 class 的组合。例如
namespace Sales;
public class Order { }
将转换为 Sales_Order
的 table 名称。
我已经为个人解决了class
builder.ToTable($"{typeof(Order).Namespace}_{typeof(Order).Name}");
如果未明确设置 ToTable
,我想将其设置为所有 table 的默认值。
protected override void OnModelCreating(ModelBuilder builder)
{
foreach(var entityType in builder.Model.GetEntityTypes())
{
if(entityType.ClrType == null) { continue; }
{
string tableName = entityType.GetTableName();
string tableNamespace = entityType.GetType().Namespace;
entityType.SetTableName($"{tableNamespace}_{tableName}");
}
}
}
但我无法获取实体 class 的命名空间。它返回 Microsoft.EntityFrameworkCore.Metadata.Internal
我的实体将位于多个不同的 class 库中,因此我希望拦截并更改模型构建器中的名称。
关于如何从模型构建器中确定实体的命名空间有什么建议吗?
entityType.GetType()
是从 object
继承的 GetType
方法,因此它将 return IMutableEntityType
的基础类型(其集合是 return编辑 builder.Model.GetEntityTypes()
), 使用 entityType.ClrType
:
string tableNamespace = entityType.ClrType.Namespace;
这是最终的解决方案。
protected override void OnModelCreating(ModelBuilder builder)
{
foreach(var entityType in builder.Model.GetEntityTypes())
{
if (entityType.ClrType == null) { continue; }
string entityName = entityType.Name.Split(".").Last();
string tableName = entityType.GetTableName();
if (tableName == entityName)
{
entityType.SetTableName($"{entityType.Name.Replace(".", "_")}");
}
}
如果实体名称与 table 名称匹配,则应用约定。如果显式 ToTable
用于应用不同的名称,则会跳过约定。