【发布时间】:2018-09-05 11:58:40
【问题描述】:
我在使用值转换时遇到了问题,这是 EF Core 2.1 中的新功能,用于列表到字符串的转换。
因为我不需要能够过滤数据库中的枚举值列表,所以我决定将我的枚举值列表映射到一个带有 int 值的逗号分隔字符串。
转换应如下所示:
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)));
}
}
【问题讨论】:
-
价值转化按预期工作。问题是(1)您使用的是可变类
List<T>(2),它也没有实现内容相等,因此通过引用进行比较。因此,EF Core 更改跟踪器无法检测到更改。你真的应该考虑用一些实现相等的自定义不可变类替换列表(a.k.a. *value object")。 -
非常感谢 - 这对我找出将来选择哪种解决方案很有帮助。
标签: entity-framework ef-core-2.1