如何使用Entity Framework Code-First方法将double 数组存储到数据库
如何使用Entity Framework Code-First将数组的双精度数据存储到数据库中,而不影响现有代码和体系结构设计?
我查看了Data Annotation和Fluent API,我还考虑将double数组转换为字节字符串,并将该字节存储到自己的列中的数据库中。
我无法访问public double[] Data { get; set; }
public double[] Data { get; set; }
使用Fluent API的属性,我得到的错误消息是:
double[]
类型必须是不可为空的值类型才能将其用作参数’T’。
存储Data
的类成功存储在数据库中,以及与此类的关系。 我只缺少Data
列。
你可以这样做:
[NotMapped] public double[] Data { get { string[] tab = this.InternalData.Split(','); return new double[] { double.Parse(tab[0]), double.Parse(tab[1]) }; } set { this.InternalData = string.Format("{0},{1}", value[0], value[1]); } } [EditorBrowsable(EditorBrowsableState.Never)] public string InternalData { get; set; }
感谢大家的投入,由于你的帮助,我能够找到解决这个问题的最佳方法。 这是:
public string InternalData { get; set; } public double[] Data { get { return Array.ConvertAll(InternalData.Split(';'), Double.Parse); } set { _data = value; InternalData = String.Join(";", _data.Select(p => p.ToString()).ToArray()); } }
感谢这些stackoverflowpost: 字符串到双打数组和双打数组 到字符串
我知道它有点贵,但你可以做到这一点
class Primitive { public int PrimitiveId { get; set; } public double Data { get; set; } [Required] public Reference ReferenceClass { get; set; } } // This is the class that requires an array of doubles class Reference { // Other EF stuff // EF-acceptable reference to an 'array' of doubles public virtual List Data { get; set; } }
现在,这将把单个实体(此处为’Reference’)映射到Primitive类的’list’。 这基本上是为了让SQL数据库感到高兴,并允许您适当地使用您的数据列表。
这可能不适合您的需求,但将是让EF快乐的一种方式。
如果使用List
而不是double[]
,会容易得多。 您已经有一个存储Data
值的表。 您可能从某个表到存储双值的表中有外键。 创建另一个反映存储双精度表的模型,并在映射类中添加外键映射。 这样您就不需要添加一些复杂的背景逻辑来检索或存储类属性中的值。
内森怀特有最好的答案(得到我的投票)。
这是对Joffrey Kern允许任意长度(未经测试)列表的答案的一个小改进:
[NotMapped] public IEnumerable Data { get { var tab = InternalData.Split(','); return tab.Select(double.Parse).AsEnumerable(); } set { InternalData = string.Join(",", value); } } [EditorBrowsable(EditorBrowsableState.Never)] public string InternalData { get; set; }
不要使用双[]使用List insted。
像这样。
public class MyModel{ ... public List Data { get; set; } ... } public class MyClass{ public int Id { get; set; } public double Value { get; set; } }
我看到的所有解决方案都很糟糕,因为:
-
如果你创建表,你不想存储这样的数据:“99.5,89.65,78.5,15.5”这是无效的! 首先它是一个字符串,这意味着你可以在其中输入字母,当你的ASP.NET服务器调用double.Parse它将导致FormatException,你真的不想要!
-
它比较慢,因为你的服务器必须解析字符串。 为什么要解析字符串而不是从SQL Server中获取几乎准备好的数据?