【问题标题】:How to change Id primary key name convention in Entity Framework Core?如何更改 Entity Framework Core 中的 Id 主键名称约定?
【发布时间】:2017-02-06 11:43:21
【问题描述】:

知道如何更改 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;
        }
    }
}

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

谢谢和最好的问候。

【问题讨论】:

  • 您无法更改约定。这是开发人员做出和构建框架的一组假设。但是,它们确实允许 configuration 来改变那些(你想要的),但他们允许的方式是通过使用属性(DataAnnotations)或 Fluent API,你说你不这样做想做。
  • 顺便说一下,我们可以使用EntityTypeBuilder,entity.HasKey(e => e.IdTableName)或者[Key]注解。谢谢 krillgar。
  • 是的。这些就是我提到的属性和 Fluent API。

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


【解决方案1】:

正如其他人所指出的,命名约定并没有真正的全局设置。我知道实现这一点的唯一方法是遍历所有实体并使用 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_<schema>_<table>“覆盖”pk_<table> 的默认命名约定。

请注意,这将重命名主键复合键。如果您只想更改主键,则必须相应地过滤键,使用:

foreach (var key in entity.GetKeys().Where(k => k.IsPrimaryKey()))
{
   //...
}

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2018-09-28
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多