Entity framework 如何为实体框架核心和npgsql中的所有主键指定defaultValueSql

Entity framework 如何为实体框架核心和npgsql中的所有主键指定defaultValueSql,entity-framework,entity-framework-core,npgsql,Entity Framework,Entity Framework Core,Npgsql,我在PostgreSql中有自己的序列生成函数,下面是next_id(),我想用它作为Entity Framework Core的所有主键的默认值。有没有办法做到这一点 我试图避免以下情况,即我必须为所有实体指定它 protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Don't want to repeat th

我在PostgreSql中有自己的序列生成函数,下面是
next_id()
,我想用它作为Entity Framework Core的所有主键的默认值。有没有办法做到这一点

我试图避免以下情况,即我必须为所有实体指定它

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        // Don't want to repeat this command for every entity!
        builder.Entity<Vote>()
        .Property(v => v.VoteId)
            .HasDefaultValueSql("next_id()");

        ....
    }
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
//不要对每个实体重复此命令!
builder.Entity()
.Property(v=>v.VoteId)
.HasDefaultValueSql(“下一个id()”);
....
}

您可以使用以下内容:

foreach (var type in modelBuilder.Model.GetEntityTypes())
{
    var primaryKey = type.FindPrimaryKey();
    if (primaryKey.Properties.Count == 1 && primaryKey.Properties[0].ClrType == typeof(int))
        primaryKey.Properties[0].Relational().DefaultValueSql = "next_id()";
}

根据您的需要,您可以删除
ClrType==typeof(int)
标准或添加另一个标准(如
primaryKey.Properties[0]。ClrType==typeof(long)
等)。

您可以使用类似以下内容:

foreach (var type in modelBuilder.Model.GetEntityTypes())
{
    var primaryKey = type.FindPrimaryKey();
    if (primaryKey.Properties.Count == 1 && primaryKey.Properties[0].ClrType == typeof(int))
        primaryKey.Properties[0].Relational().DefaultValueSql = "next_id()";
}

根据您的需要,您可以删除
ClrType==typeof(int)
标准或添加另一个标准(如
primaryKey.Properties[0].ClrType==typeof(long)
等)。

工作起来很有魅力。非常感谢。工作得很有魅力。非常感谢。