我有一种情况,我必须根据实体的两个属性来生成一个ID。例如:
public class Foo
{
public string Id { get; set; }
public int BarId { get; get; }
public int WafuId { get; set; }
}
该ID的值应为{BarId}_{WafuId}
,因此它可以是1_1
或1_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; }
}
它可以完成工作,但不确定这是否是更好的方法。
答案 0 :(得分:1)
使用流畅的API表示法,您可以使用如下所示的SQL计算列:
builder.Property(e => e.Id)
.HasComputedColumnSql("[BarId] + '_' + [WafuId]");
您也可以查看此example。