EF Core 2.1 值转换更新问题

3

我在使用值转换时遇到了问题,这是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)));
}
}

1
值转换按预期工作。问题在于(1)您正在使用可变类 List<T>(2)该类也未实现内容相等性,因此是按引用比较的。由于这个原因,EF Core 更改跟踪器无法检测到更改。您应该真正考虑将列表替换为一些自定义不可变类,它实现了相等性(也称为 * 值对象)。 - Ivan Stoev
非常感谢 - 这对我未来选择解决方案非常有帮助。 - Edub
1个回答

1

当使用DbContext.Set<T>.Update(entity)而不是从上下文中获取实体,更改一些属性然后调用.SaveChangesAsync()时,List<T>的值转换对我有用。这可能是由于@Ivan Stoev关于相等比较的说法。 Update()将实体中的所有属性标记为已更改。也许并非在所有情况下都需要,但可以快速修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接