如何在Entity Framework Core中更改ID主键名称约定?

问题描述 投票:1回答:1

有人知道如何更改Entity Framework Core约定中主键的默认名称(Id)?没有DataAnnotations或FluentAPI中的配置。

我正在尝试通过EntityFrameworkCore.Metadata.Builders的扩展名对其进行更改,例如:

using Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
namespace Project.Extensions.Microsoft.EntityFrameworkCore.Metadata.Builders
{
    public sealed class DefaultConvetionsPrimaryKey : IModelConvention
    {
        public InternalModelBuilder Apply(InternalModelBuilder modelBuilder)
        {
            foreach (var entity in modelBuilder.Metadata.GetEntityTypes())
            {
                foreach (var item in entity.GetDeclaredProperties())
                {
                    if(item.Name == "IdTableName") 
                    {
                          //Set primary key
                    }
                }       
            }

            return modelBuilder;
        }
    }
}

有可能吗?欢迎其他方式。

感谢和最诚挚的问候。

c# asp.net entity-framework-core ef-fluent-api
1个回答
0
投票

正如其他人指出的那样,命名约定实际上并没有一个全局设置。我知道实现此目标的唯一方法是遍历所有实体,并使用YourDbContext.OnModelCreating()方法中的FluentAPI更新其主键。

例如:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var key in entity.GetKeys())
        {
            key.SetName($"pk_{entity.GetSchema()}_{entity.GetTableName()}");
        }
    }
}

这将用pk_<table>“替代” pk_<schema>_<table>的默认命名约定。

请注意,这将重命名主键

复合键。如果只想更改主键,则必须使用以下方法相应地过滤键:
foreach (var key in entity.GetKeys().Where(k => k.IsPrimaryKey()))
{
   //...
}
© www.soinside.com 2019 - 2024. All rights reserved.