EF Code First - словарь карт или пользовательский тип как nvarchar

Я хочу сначала использовать EF-код для базы данных, к которой я сейчас обращаюсь, используя обычный старый ADO.NET с хранимыми процедурами.

В моей базе данных есть несколько столбцов nvarchar(MAX), которые должны быть сопоставлены с и .

При сохранении в базе данных это строка в формате XML. Я использую этот метод, чтобы обеспечить интернационализацию, например, имя продукта в интернет-магазине. Я не знаю, сколько языков любой пользователь хочет перевести, поэтому я не могу иметь столбец Name для каждого языка.

Я также хотел, чтобы избежать сохранения значений в отдельной таблице, поэтому я закончил с помощью подхода Dictionary - XML.

То, как я это делаю сейчас, заключается в том, чтобы просто рассматривать любой из этих столбцов как строку, когда я взаимодействую с базой данных. У меня есть настраиваемая функция mapper, которая может превратить XML в словарь и обратно в XML.

Но я не могу найти способ сделать это с EF Code в первую очередь? Любые идеи?

Ответ 1

Вы можете добавить свойство, которое вернет ваш Dictionary<,> как строку XML, а затем удалит сопоставление для вашего свойства Dictionary<,>.

    [NotMapped]
    public Dictionary<string,string> MyDictionary
    {
     get; set;
    }

    public string DictionaryAsXml
    {
        get
        {
             return ToXml(MyDictionary);
        }
        set
        {
           MyDictionary = FromXml(value);
        }
    }

Если вы не хотите показывать свое свойство DictionaryAsXml, посмотрите этот пост в блоге. Он показывает, как вы можете сохранять частные и защищенные свойства.

Ответ 2

У меня были некоторые трудности с преобразованием xml в VB.NET. Поэтому я использовал newtonsoft.json для сериализации словаря для строки JSON и обратно.

Public Property JsonDict As String
    Get
        If MyDict Is Nothing Then
            Return Nothing
        Else
            Return JsonConvert.SerializeObject(MyDict)
        End If
    End Get
    Set(value As String)
        If value Is Nothing Then
            MyDict = Nothing
        Else
            MyDict = JsonConvert.DeserializeObject(Of Dictionary(Of Single, Single))(value)
        End If
    End Set
End Property
<NotMapped>
Public Property MyDict As Dictionary(Of Single, Single)