【问题标题】:Get namespace of entity class in EF Core model builder在 EF Core 模型构建器中获取实体类的命名空间
【发布时间】:2022-01-26 06:19:20
【问题描述】:

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

namespace Sales;

public class Order { }

将转换为Sales_Order 的表名。

我已经为个别班级制定了这个办法

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}");
        }
    }
}

但我无法获取实体类的命名空间。而是返回Microsoft.EntityFrameworkCore.Metadata.Internal

我的实体将位于多个不同的类库中,因此我希望在模型构建器中拦截并更改名称。

关于如何在模型构建器中确定实体的命名空间有什么建议吗?

【问题讨论】:

    标签: c# entity-framework-core ef-core-6.0


    【解决方案1】:

    entityType.GetType() 是从object 继承的GetType 方法,因此它将返回IMutableEntityType 的底层类型(其集合由builder.Model.GetEntityTypes() 返回),使用entityType.ClrType:

    string tableNamespace = entityType.ClrType.Namespace;
    

    【讨论】:

      【解决方案2】:

      这是最终的解决方案。

      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 来应用不同的名称,则会跳过约定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-14
        • 2011-08-16
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 2020-02-03
        相关资源
        最近更新 更多