通过 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 文档。
我正在尝试为我的服务的每个请求添加和删除 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 文档。