如何使用Entity Framework Code-First方法将double []数组存储到数据库

jon*_*nas 24 .net c# entity-framework fluent-interface ef-code-first

如何使用Entity Framework Code-First将数组的双精度数据存储到数据库中,而不影响现有代码和体系结构设计?

我查看了Data Annotation和Fluent API,我还考虑将double数组转换为字节字符串,并将该字节存储到自己的列中的数据库中.

我无法使用public double[] Data { get; set; }Fluent API 访问该属性,我得到的错误消息是:

该类型double[]必须是非可空值类型才能将其用作参数"T".

Data存储的类成功存储在数据库中,以及与此类的关系.我只是错过了Data专栏.

Jof*_*ern 44

你可以这样做:

    [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; }
Run Code Online (Sandbox Code Playgroud)


jon*_*nas 25

感谢大家的投入,由于你的帮助,我能够找到解决这个问题的最佳方法.这是:

 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());
    }
 }
Run Code Online (Sandbox Code Playgroud)

感谢这些stackoverflow帖子: 字符串到双打数组双打数组到字符串

  • 如果有人想知道,`InternalData`必须是公共的,否则它将不是数据库模式的一部分.将`[NotMapped]`添加到`Data`属性也是一个好主意,即使它是不必要的.这清楚地表明该属性不是数据库模式的一部分. (3认同)
  • 我认为这个解决方案并不完整。每次索引访问数组时,都会自动从字符串重新创建数组。在我看来,“get”返回“_data”会更好。另一个问题是当你去设置单个元素时:这不会被存储,因为它通过“get”而不是“set”!尝试声明“Data=new []{0,0,0}”,然后调用“Data[1]=2”并尝试读回“Data[1]”。你会看到它是0 (2认同)

Nat*_*ite 5

我知道它有点贵,但你可以做到这一点

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<Primitive> Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,这将把单个实体(此处为'Reference')映射到Primitive类的'list'.这基本上是为了让SQL数据库感到高兴,并允许您适当地使用您的数据列表.

这可能不适合您的需求,但会让EF感到高兴.


归档时间:

查看次数:

27785 次

最近记录:

7 年,3 月 前