entity-framework - EF Core 2.1 值转换更新问题
问题描述
我在使用值转换(EF Core 2.1 中的新功能)进行列表到字符串转换时遇到了问题。
由于我不需要能够过滤数据库中的枚举值列表,因此我决定将我的枚举值列表映射到带有 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()
将实体中的所有属性标记为已更改。也许并非在所有情况下都需要,但可以快速解决。
推荐阅读
- c# - 停止格式化数字的 Asp.Net Core 标签助手
- android - 如何为 android 应用程序正确创建深色主题?
- node.js - 从终端创建 MongoDB 数据库(无 shell)
- google-sheets - 尝试仅使用一个单元格公式在一列中创建一列命名的学校课程:1A、1B、1C、1D、2A、2B
- java - 输入(实际上是输出)流在读取时被阻塞并且不返回 null JAVA -> br.readLine()
- duckdb - 如何在duckdb上真空(减少文件大小)
- c# - Windows 窗体文本框字体颜色限时更改
- echo - echo unicode 不适用于更高的代码点
- mysql - 每个唯一列中的多个 id 并将它们连接起来以在同一行上获取每个 ID 的详细信息
- javascript - 未选择单选按钮时显示警报