通过 ModelBuilder 转换为 GUID 添加和删除前缀

Add & Remove prefix to GUID via ModelBuilder conversion

我正在尝试为我的服务的每个请求添加和删除 GUID 的前缀。

像这样

 modelBuilder.Entity<MyEntity>()
                .Property(e => e.Id)
                .HasConversion(
                    v => PrefixConstant + v,
                    v => Guid.Parse(v.Substring(PrefixConstant.Length)));

其中 PrefixConstant 只是一个包含 "ABC_" 之类内容的字符串。这个想法是将 id 存储为 GUID,但是 return 它带有客户端的前缀。

上述方法运行不佳,出现 id is of type uuid but expression is of type text

错误

错误的原因已经很清楚了。你得到错误是因为你想将 Guid 转换为 string 并将其保存到类型为 Guid!

的数据库列

我认为你选错了选项。 HasConversion适用于你想转换数据并保存转换后的数据,但你的意图只是以另一种方式向客户端显示属性的情况(你这里关心的是UI,而不是逻辑) .所以我认为改变你的模型是更好的选择:

public class MyEntity
{
    private const string PrefixConstant = "ABC_";
    private Guid id;
    public string Id
    {
        set => id = Guid.Parse(value.Replace(PrefixConstant, string.Empty));
        get => $"{PrefixConstant}{id.ToString()}";
    }
}

这只是为了向您展示这个想法。如果您将此代码用作 DataModel,即使此代码也不是最佳实践,因为您不应该使用 DataModel 而不是 ViewModel。 我在这里MyEntity的意图是ViewModel而不是DataModel,你应该注意它们的区别并将它们彼此分开。

The idea is to store the id as a GUID, but return it with a prefix to the client.

虽然实现完全相反。这里定义的值转换

.Property(e => e.Id)
.HasConversion(
    v => PrefixConstant + v, // (1)
    v => Guid.Parse(v.Substring(PrefixConstant.Length)) // (2)
)

表示class属性Id类型为Guid,在数据库中存储为string,使用(1)写和(2)读取数据库值时。

所以你只需要简单地交换类型和转换,例如制作 Id 属性 类型 string

public class MyEntity
{
    public string Id { get; set; }
}

并配置to/from数据库Guid转换

.Property(e => e.Id)
.HasConversion(
    v => Guid.Parse(v.Substring(PrefixConstant.Length)),
    v => PrefixConstant + v
)

有关详细信息,请参阅 Value Conversions and ValueConverter<TModel,TProvider> class 的 EF Core 文档。