繁体   English   中英

在 EF Core model 构建器中获取实体 class 的命名空间

[英]Get namespace of entity class in EF Core model builder

我正在尝试建立一个表命名约定,以便表名是命名空间和 class 的组合。 例如

namespace Sales;

public class Order { }

将转换为Sales_Order的表名。

我已经为个人 class

builder.ToTable($"{typeof(Order).Namespace}_{typeof(Order).Name}");

如果未明确设置ToTable ,我想将此设置为所有表的默认值。

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 库中,因此我希望在 model 构建器中拦截并更改名称。

关于如何从模型构建器中确定实体命名空间的任何建议?

entityType.GetType()是从object继承的GetType方法,因此它将返回IMutableEntityType的基础类型(其集合由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(".", "_")}");
        }

}

如果实体名称与表名称匹配,则应用约定。 如果使用显式ToTable来应用不同的名称,则会跳过约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM