簡體   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