我使用值转换遇到问题,这是EF Core 2.1中的新增功能,用于列表到字符串的转换。
因为我不需要过滤数据库中的Enum值列表,所以我决定将我的Enum值列表映射到带有int值的逗号分隔的字符串。
转换应如下所示:
From: List<EnumType>{EnumType.Value1, EnumType.Value2}
To: 1,2
[一切似乎都正常,但是EF似乎没有注意到Enum值列表已更改,并且不会在数据库中发布更新。是否存在不允许列表进行值转换的限制?
值转换代码如下:
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>
上的值转换在使用DbContext.Set<T>.Update(entity)
而不是从上下文中获取实体,更改某些属性然后调用.SaveChangesAsync()
时为我工作。这可能是由于@Ivan Stoev关于平等比较说的。 Update()
将实体中的所有属性标记为已更改。也许并非在所有情况下都希望如此,但是可以快速解决。