EF核心:在可选外键中将Guid.Empty解释为null



我有一个配置为.IsRequired(false)Guid外键。我希望能够将这个外键设置为Guid.Empty,以表示它为null。

但当我尝试这样使用它时,会生成以下查询:

Microsoft.EntityFrameworkCore.Database.Command:Error: Failed executing DbCommand (1ms) [Parameters=[@p0='d644704c-7735-47a6-cea5-08d87bf854bb' (DbType = String), @p1='2017-07-12T14:33:10' (DbType = String), @p2='00000000-0000-0000-0000-000000000000' (DbType = String), @p3='2020-10-29T10:50:01' (DbType = String), @p4='scan1' (Nullable = false) (Size = 5), @p5='0' (DbType = String), @p6='V;Potential;E' (Nullable = false) (Size = 13)], CommandType='Text', CommandTimeout='30']
INSERT INTO "DataArrays" ("Id", "CreatedOn", "DataSetId", "LastModifiedOn", "Name", "Order", "Unit")  
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6);

它试图将@p2设置为00000000-0000-0000-0000-000000000000,这导致数据库返回外键约束错误,因为它不是有效的键。

如何配置EF以使Guid.Empty被解释为null?

您可以为此使用ValueConverters。有许多内置转换器可用,但没有一个适合您的需求。您必须通过继承ValueConverter类来创建一个自定义转换器。

正确答案有点隐藏在@Thomas Ducheyne答案的评论中。首先使用ValueConverter将Guid.Empty转换为null:

internal class GuidToNullConverter : ValueConverter<Guid?, Guid?>
{
public GuidToNullConverter(ConverterMappingHints? mappingHints = null)
: base(x => x == Guid.Empty ? default : x, x => x, mappingHints)
{
}
}

然后,您可以在DbContext类中使用此转换器,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourEntity>()
.Property(e => e.YourGuidProperty)
.HasConversion(new GuidToNullConverter());
}

最新更新