2012-01-23 5 views
6

먼저 저장 프로 시저를 사용하여 일반 이전 ADO.NET을 사용하여 현재 액세스하고있는 데이터베이스에 EF 코드를 사용하려고합니다.EF 코드 첫 번째 - 사전 또는 사용자 지정 형식을 nvarchar로

내 데이터베이스에는 Dictionary<string, string>에 매핑해야하는 일부 nvarchar(MAX) 열이 있습니다.

데이터베이스에 저장하면 XML 형식의 문자열입니다. 나는이 기술을 사용하여 국제화를 허용한다. 온라인 상점에있는 제품의 이름. 각 언어에 대해 Name 열을 가질 수 없기 때문에 주어진 사용자가 얼마나 많은 언어로 번역 할 것인지 알 수 없습니다.

필자는 별도의 테이블에 값을 저장하지 않으려 고했기 때문에 Dictionary-XML 방식을 사용하게되었습니다.

지금 내가하는 방식은 데이터베이스와 상호 작용할 때마다 이러한 열을 문자열로 취급하는 것입니다. 나는 XML을 사전으로 바꿀 수있는 커스텀 매퍼 함수를 ​​가지고 있으며 XML로 돌아 간다.

하지만 EF 코드를 사용하여이 작업을 수행 할 수있는 방법을 찾을 수없는 것 같습니다. 어떤 아이디어?

답변

12

Dictionary<,>을 XML 문자열로 반환하는 속성을 추가 한 다음 Dictionary<,> 속성의 매핑을 제거 할 수 있습니다.

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

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

당신이 당신의 DictionaryAsXml 속성을 노출하지 않으려는 경우

this blog post를 보라. 개인 및 보호 된 속성을 유지하는 방법을 보여줍니다.

+0

굉장! 감사합니다 :) - 그럴 생각은 없었습니다 – Yablargo

+0

왜 JSON이 아닌 XML이고, 마지막이 더 작고 DB 저장 기간이 더 효율적일까요? – Piou

+1

@Piou 5 년 전에 내가 생각한 것을 정확히 기억할 수는 없지만 XML에 익숙하다면 JSON에 익숙해 졌을 것입니다. 나는이 예제가 JSON에서도 작동 할 것이라고 생각한다. 그러나 조숙 한 최적화는 모든 악의 뿌리임을 기억하십시오. –

2

VB.NET에서 xml 변환에 어려움이있었습니다. 따라서 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)