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

时间:2017-05-07 17:12:13

标签: 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 this command for every entity!
        builder.Entity<Vote>()
        .Property(v => v.VoteId)
            .HasDefaultValueSql("next_id()");

        ....
    }

1 个答案:

答案 0 :(得分:4)

您可以使用以下内容:

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)等)。