【问题标题】:Automatically store pickled data, retrieve unpickled data with EF5自动存储腌制数据,使用 EF5 检索未腌制数据
【发布时间】:2012-12-03 16:34:14
【问题描述】:

标题很糟糕,我知道,所以这里是长版本:

我需要将可变数据存储在数据库列中——主要是键值对,但项目的数量和这些项目的名称在运行时都是完全未知的。我最初的想法是将数据(字典)“腌制”成类似 JSON 字符串的东西,可以存储在数据库中。当我检索该项目时,我会将 JSON 字符串转换(“unpickle”)为普通的 C# 字典。显然,我不希望任何人直接与 JSON 字符串交互,因此对应于数据库列的实际属性应该是私有的,并且我将有一个不会被映射的公共 getter 和 setter。

private string Data { get; set; }
public Dictionary<string, object> DataDictionary
{
    get
    {
        return Deserialize(Data);
    }
    set
    {
        Data = Serialize(value);
    } 
}

问题当然是 EF 将拒绝映射私有 Data 属性,而实际上想要映射不应该映射的公共 DataDictionary 属性。我相信有办法解决这个问题,但是这开始产生的复杂性让我觉得我正在进入一个我不应该进入的兔子洞。我的想法在这里合理吗,还是应该换个方向?

我想我可以简单地与只包含键和值列的基本表创建一对多关系,但这感觉很陈旧。但是,考虑到 EF 的固有局限性,这实际上可能是更好的选择?

【问题讨论】:

  • 就个人而言,从数据库的角度来看,如果我将键值对存储在单个列中,我会想退后一步看看数据库设计。虽然它对于当前的需求似乎很好,但如果你出于某种原因需要查询它们,它可能会回来并咬你......
  • 在大多数情况下,我同意你的看法。在这种情况下,我正在处理短期持久存储。存储的数据与当前运行时相关,单独查询没有意义。

标签: c# asp.net-mvc entity-framework entity-framework-5


【解决方案1】:

您是否尝试过使用Complex Types?您应该能够通过在 EF 模型上创建复杂类型的字符串来实现您的目标。

首先向模型添加一个复杂类型。在复杂类型上,添加将保存数据的字符串类型的标量属性。

然后,您可以在将保存数据的实体上创建这种复杂类型的属性。

代码生成器应添加一个分部类,该类提供对复杂类型属性的访问。创建一个复杂类型的新部分类,并在您的问题中添加序列化/反序列化代码作为属性。然后,您可以使用此属性访问数据。

本示例中的复杂类型本质上是一个值的包装器,允许您将数据值存储到存储中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多