1

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

我需要将可变数据存储在数据库列中——主要是键值对,但项目的数量和这些项目的名称在运行时都是完全未知的。我最初的想法是将数据(字典)“腌制”成 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 的固有局限性,这实际上是一条更好的路线吗?

4

1 回答 1

0

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

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

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

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

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

于 2013-01-09T16:07:07.653 回答