C# Postgres 在插入新记录后跳过 ENUM 列

问题描述 投票:0回答:1

C# Postgres 在插入新记录后跳过 ENUM 列,并且默认值保存在数据库中。

我正在尝试向 postgres 表 EncounterBatchItem 添加新记录。似乎它在插入和采用默认值“已处理”时跳过枚举值

public enum EncounterBatchItemStatus
{
    Invalid,
    Processed
}

public class EncounterBatchItem
{
    public long Id { get; set; }
    public int EncounterBatchId { get; set; }
    public int EncounterId { get; set; }
    public EncounterBatchItemStatus Status { get; set; }
    public long Balance { get; set; }
}
builder.Property(x => x.Status)
            .IsRequired()
            .HasColumnType("enum_encounter_batch_item_status")
            .HasColumnName("status")
            .HasDefaultValue(EncounterBatchItemStatus.Processed)
            .HasConversion<EncounterBatchItemStatus>();
migrationBuilder.Sql(@"CREATE TYPE enum_encounter_batch_item_status AS ENUM (
                                'Invalid',
                                'Processed');");
var encounterBatchItem = new EncounterBatchItem
     {
         EncounterBatchId = 136,
         EncounterId = 17,
         Balance = 1000,
         Errors = new List<EncounterBatchItemError>(),
         Status = EncounterBatchItemStatus.Invalid
     };

await _context.EncounterBatchItems.AddAsync(encounterBatchItem, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);

当我检查 SQL 插入脚本时,由于某种原因它跳过了

status
列:

INSERT INTO encounter_batch_item (balance, encounter_batch_id, encounter_id, errors)
VALUES (@p4, @p5, @p6, @p7)
RETURNING id, status;

通过将

Status
更改为可为空,它可以工作,但是
Status
是必需列,所以我不想将其设为可为空。

public class EncounterBatchItem
{
    public long Id { get; set; }
    public int EncounterBatchId { get; set; }
    public int EncounterId { get; set; }
    public EncounterBatchItemStatus? Status { get; set; }
    public long Balance { get; set; }
}
c# .net postgresql enums
1个回答
0
投票

尝试使用

MapEnum
方法来配置此映射,请参阅 https://www.npgsql.org/efcore/mapping/enum.html?tabs=without-datasource

var dataSourceBuilder = new NpgsqlDataSourceBuilder(/* connection string */);
dataSourceBuilder.MapEnum<Mood>();
var dataSource = dataSourceBuilder.Build();

builder.Services.AddDbContext<MyContext>(options => options.UseNpgsql(dataSource));
© www.soinside.com 2019 - 2024. All rights reserved.