在我看来,几乎所有其他答案都与应有的相反。实体 EF 应该管理字符串,并且必须从中生成数组。因此,只有当 EF 访问该字符串时,该数组必须是整体读写的。
涉及 Data[] 逻辑的解决方案是错误的,因为正如我在评论中所写,您会遇到矛盾的情况。在所有其他条件下,变量必须保持为纯数组。正如我目前所见,通过将“get”和“set”逻辑放入 Data[] 中,会发生这种情况:
1 - 每次对数组进行索引访问时,都会自动从字符串重新创建数组。这是一个无用的工作,想想循环中的迭代......
2 - 当您设置单个元素时,它不会被存储,因为它通过“get”而不是“set”。如果您尝试声明Data=new []{0,0,0}
然后设置Data[1]=2
,则重新读取 Data[1] 结果为 0。
我的解决方案是彻底扭转逻辑。
public string Data_string
{
get => string.Join(';', Data??Array.Empty());
set => Data= value == null ? Array.Empty<double>() : Array.ConvertAll(value.Split(';',StringSplitOptions.RemoveEmptyEntries), double.Parse);
}
[NotMapped]
public double[] Data {get;set;}
显然,这只适用于在数据库上存储和检索数据,对 Data_string 的访问是 EF 独有的。
一旦从 DB 中读取字符串,它就会与Data_string相关联,后者通过 set 创建Data数组。此时,您可以处理Data 而不会以任何方式影响字符串,例如普通数组。当您要求 EF 保存到 DB 中时,通过Data_string属性中的 get,字符串将根据Data元素完全重构,然后存储为字符串。
实际上,字符串只修改了两次,在从数据库读取时和保存时。
在我看来,这个解决方案比在字符串上连续运行要高效得多。