自动存储pickle数据,使用EF5检索未打印的数据

时间:2012-12-03 16:34:15

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

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

我需要将变量数据存储在数据库列中 - 主要是键值对,但在运行时,项目数和这些项的名称都是完全未知的。我最初的想法是将数据(字典)“pickle”成类似JSON字符串的东西,它可以存储在数据库中。当我检索项目时,我会将(“unpickle”)JSON字符串转换为普通的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的固有局限性,这可能是一条更好的途径?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

此示例中的复杂类型基本上充当允许您将数据值存储到存储的值的包装。