您可以使用 @nbrosz 的 answer 来解决您的问题,但如果您使用的是 EF Core 2.1,则不再需要执行这种解决方法。您可以使用 EF Core 2.1(自 2018 年 5 月 7 日起在 Release Candidate 1 中)摆脱支持字段,您可以使用 Microsoft 解释的值转换功能 here:
值转换器允许在读取时转换属性值
从或写入数据库。这种转换可以来自一个值
到另一个相同类型的(例如,加密字符串)或从
一种类型的值到另一种类型的值(例如,
将枚举值与数据库中的字符串相互转换。)
因此,对于您的情况,您可以删除支持字段。你不再需要它了。你的类应该是这样的:
public class Person
{
public PhoneNumber Phone { /* Some clever get/set logic here */ }
}
在您的OnModelCreating 方法中,您可以像下面这样配置转换:
modelBuilder.Entity<Person>()
.Property(p => p.Phone)
.HasConversion(
phone => {
// Here you code the logic of how to get the value to store in DB
return ...;
},
dbValue => {
// Here you code the logic of how to construct the PhoneNumber instance from the value to store in DB
}
);
就是这样。实际上它在候选版本中,但微软说:
EF Core 2.1 RC1 是一个“上线”版本,这意味着一旦您测试了
您的应用程序与 RC1 一起正常工作,您可以在
生产并获得 Microsoft 的支持,但您仍然应该
更新到最终的稳定版本。
我的答案的其余部分适用于 @nbrosz,因为您正在处理枚举类型。您可以删除支持字段,也可以使用 EF Core 2.1 提供的众多内置值转换器之一。对于枚举到字符串值的转换,我们有EnumToStringConverter 类型。对于您在答案中所做的逻辑,您可以将其简化为实体:
[Display(Name = "Fire Type")]
public Enums.FireType Type { get; set; }
我们删除了属性上的NotMapped 属性,并且没有逻辑 y 进行转换。
在您的 OnModelCreating 方法中,您可以这样做:
var converter = new EnumToStringConverter<FireType>();
modelBuilder
.Entity<Fire>()
.Property(e => e.FireType)
.HasConversion(converter);
您还可以使用HasConversion<T> 的通用版本让 EF Core 为您检测正确的转换器,如下所示:
modelBuilder
.Entity<Fire>()
.Property(e => e.FireType)
.HasConversion<string>();
如果您不喜欢使用流畅的配置,您可以使用Column 数据注释属性,如下所示,EF Core 将为您进行转换:
[Column(TypeName = "nvarchar(20)")]
[Display(Name = "Fire Type")]
public Enums.FireType Type { get; set; }