2012-01-23 17 views
6

Tôi muốn sử dụng mã EF đầu tiên cho cơ sở dữ liệu mà tôi hiện đang truy cập bằng ADO.NET cũ với các thủ tục được lưu trữ.Mã EF Thứ nhất - Từ điển bản đồ hoặc kiểu tùy chỉnh làm nvarchar

Trong cơ sở dữ liệu của tôi, tôi có một số cột nvarchar(MAX) sẽ được ánh xạ tới và từ Dictionary<string, string>.

Khi được lưu vào cơ sở dữ liệu, nó là một chuỗi được định dạng XML. Tôi sử dụng kỹ thuật này để cho phép quốc tế hóa, ví dụ: tên của sản phẩm trong cửa hàng trực tuyến. Tôi không biết có bao nhiêu ngôn ngữ mà bất kỳ người dùng nào muốn dịch để tôi không thể có một cột Name cho từng ngôn ngữ.

Tôi cũng muốn tránh lưu trữ các giá trị trong một bảng riêng biệt, vì vậy tôi đã kết thúc bằng cách tiếp cận Từ điển - XML.

Cách tôi làm ngay bây giờ, là chỉ xử lý bất kỳ cột nào trong số các cột này dưới dạng chuỗi bất cứ khi nào tôi tương tác với cơ sở dữ liệu. Tôi có một hàm bản đồ tùy chỉnh có thể biến XML thành một từ điển và quay lại XML.

Nhưng tôi dường như không thể tìm cách làm điều này bằng EF Code trước? Bất kỳ ý tưởng?

Trả lời

12

Bạn có thể thêm thuộc tính sẽ trả về Dictionary<,> dưới dạng chuỗi XML và sau đó xóa ánh xạ cho thuộc tính Dictionary<,> của bạn.

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

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

Nếu bạn không muốn để lộ tài sản DictionaryAsXml bạn có một cái nhìn tại this blog post. Nó cho thấy cách bạn có thể duy trì các thuộc tính riêng tư và được bảo vệ.

+0

Tuyệt vời! Cảm ơn :) - Tôi sẽ không nghĩ rằng để làm điều đó – Yablargo

+0

Tại sao XML và không JSON, cuối cùng là nhỏ gọn hơn và sẽ có hiệu quả hơn trong điều khoản lưu trữ DB không? – Piou

+1

@Piou Tôi không thể nhớ chính xác những gì tôi đã suy nghĩ cách đây năm năm nhưng tôi đoán tôi vẫn còn được sử dụng nhiều hơn để XML sau đó để JSON. Tôi giả sử ví dụ cũng sẽ làm việc với JSON vì vậy hãy thử nó. Tuy nhiên hãy nhớ rằng tối ưu hóa sớm là gốc rễ của mọi điều ác. –

2

Tôi gặp một số khó khăn với việc chuyển đổi xml trong VB.NET. Do đó, tôi đã tận dụng newtonsoft.json để tuần tự hóa từ điển thành chuỗi JSON và ngược lại.

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) 
Các vấn đề liên quan