EF Code First - словарь карты или пользовательский тип как nvarchar - PullRequest
7 голосов
/ 23 января 2012

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

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

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

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

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

Но я не могу сначала найти способ сделать это с EF Code?Есть идеи?

Ответы [ 2 ]

13 голосов
/ 23 января 2012

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

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

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

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

3 голосов
/ 31 января 2015

У меня были некоторые трудности с преобразованием 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...