如何从EF Core中的实体属性生成自定义ID?

时间:2020-08-16 18:30:31

标签: c# ef-core-3.1

我有一种情况,我必须根据实体的两个属性来生成一个ID。例如:

public class Foo
{
    public string Id { get; set; }
    
    public int BarId { get; get; }
    
    public int WafuId { get; set; }
}

该ID的值应为{BarId}_{WafuId},因此它可以是1_11_2,并且应在每次创建记录时注入。

我已通过执行以下代码行builder.Property(p => p.Id).ValueGeneratedNever();从数据库中删除了默认值生成:然后尝试了ValueGenerator

public class FooIdValueGenerator : ValueGenerator<string>
{
    public override string Next(EntityEntry entry)
    {
        var ent = new Foo();
        var barIdPropName = nameof(ent.BarId);
        var wafuIdPropName = nameof(ent.WafuId);
        
        var id1 = entry.CurrentValues[barIdPropName];
        var id2 = entry.CurrentValues[wafuIdPropName];

        return $"{id1}_{id2}";
    }

    public override bool GeneratesTemporaryValues { get; }
}

它可以完成工作,但不确定这是否是更好的方法。

1 个答案:

答案 0 :(得分:1)

使用流畅的API表示法,您可以使用如下所示的SQL计算列:

 builder.Property(e => e.Id)
        .HasComputedColumnSql("[BarId] + '_' + [WafuId]");

您也可以查看此example