我在使用值转换时遇到了问题,这是EF Core 2.1中的新功能,用于将列表转换为字符串。
由于我不需要在数据库中过滤枚举值列表,因此我决定将我的枚举值列表映射为逗号分隔的带有整数值的字符串。
转换应该如下所示:
From: List<EnumType>{EnumType.Value1, EnumType.Value2}
To: 1,2
一切似乎都运行正常,但EF似乎没有注意到枚举值列表已更改,并且不会在数据库中发出更新。是否存在不允许列表进行值转换的限制?
值转换代码如下:
private const char ENUM_LIST_DELIMITER = ',';
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Entity>().Property(x => x.Types)
.HasConversion(x => ConvertToString(x), x => ConvertToEnumList<EnumType>(x));
}
private static List<TEnum> ConvertToEnumList<TEnum>(string value) where TEnum : struct, IConvertible
{
return value?.Split(ENUM_LIST_DELIMITER)
.Select(Enum.Parse<TEnum>)
.ToList();
}
private static string ConvertToString<TEnum>(IEnumerable<TEnum> value) where TEnum : struct, IConvertible
{
return string.Join(ENUM_LIST_DELIMITER, value.Select(x => Convert.ToInt32(x)));
}
}
List<T>
(2)该类也未实现内容相等性,因此是按引用比较的。由于这个原因,EF Core 更改跟踪器无法检测到更改。您应该真正考虑将列表替换为一些自定义不可变类,它实现了相等性(也称为 * 值对象)。 - Ivan Stoev