有谁知道如何在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;
}
}
}
有可能吗?欢迎其他方式。
谢谢和最诚挚的问候。
答案 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()))
{
//...
}