如何更改Entity Framework Core中的Id主键名称约定?

时间:2016-09-28 13:05:14

标签: c# asp.net entity-framework-core ef-fluent-api

有谁知道如何在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;
        }
    }
}

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

谢谢和最诚挚的问候。

1 个答案:

答案 0 :(得分: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()))
{
   //...
}