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)