2012-07-02 26 views
8

Tôi có Mã Lớp/bảng đầu tiên và một trong các trường có kiểu chuỗi/nvarchar. Chuỗi này là biểu diễn JSON của cá thể MyClass. Tôi chỉ muốn hoạt động trong mã với các cá thể MyClass, nhưng lưu trữ nó dưới dạng một chuỗi (JSON) trong cơ sở dữ liệu. Hãy nói rằng bàn của tôi trông như thế này:Khuôn khổ thực thể: Tuần tự hóa/Deserialize cột JSON đằng sau hậu trường

public class Message 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string JsonDefinition { get; set; } 
} 

tôi muốn có nó như thế này

public class Message 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    [JSON] 
    public MyClass JsonDefinition { get; set; } 
} 

đâu JSON là một thuộc tính tùy chỉnh mà nói với EF để lưu trữ sân khi chuỗi tuần tự của MyClass dụ . Và đồng thời nó nói EF: "một khi bạn kéo thực thể, thay thế chuỗi JsonDefinition với cá thể hóa của MyClass"

Có thể đạt được với các cơ chế EF 4 hiện tại không? Nếu có thì làm sao?

Xin cảm ơn trước.

EDIT: MyClass có thể là Từ điển hoặc bất kỳ loại phức tạp nào khác.

+0

tis có thể trợ giúp: http://www.reddnet.net/entity-framework-json-column/ –

Trả lời

8

Không trực tiếp. Bạn phải luôn có sẵn thuộc tính chuỗi trong lớp của bạn vì EF yêu cầu nó cho sự kiên trì. Bạn cũng có thể có thuộc tính không được ánh xạ MyClass của mình nhưng bạn phải xử lý tuần tự và deserialization theo cách thủ công và làm cho các thuộc tính đó được đồng bộ hóa.

Giải pháp Naive là triển khai INotifyPropertyChanged trong MyClass và đảm bảo rằng mọi thay đổi trong giá trị MyClass hoặc trong bất kỳ thuộc tính nào của nó sẽ kích hoạt việc tuần tự hóa JSON thành thuộc tính chuỗi. Giải pháp ngây thơ này làm việc cho một số vấn đề đơn giản nhưng trong trường hợp này nó thực sự là ý tưởng tồi vì nó có thể có tác động hiệu suất lớn nếu bạn sửa đổi rất nhiều thuộc tính trên thuộc tính được gán MyClass.

Một cách khác là sử dụng móc của EF để hiện thực hóa và lưu thay đổi. Bạn sẽ cần phải xử lý sự kiện ObjectContext.ObjectMaterialized (bạn có thể nhận được ObjectContext từ DbContext qua IObjectContextAdapter được triển khai rõ ràng bởi DbContext). Trong trình xử lý sự kiện này, bạn sẽ sử dụng giá trị của thuộc tính chuỗi và deserialize nội dung của nó thành thuộc tính MyClass. Bạn cũng sẽ phải ghi đè lên DbContext.SaveChanges nơi bạn sẽ tìm kiếm tất cả các trường hợp Message cần được chèn hoặc cập nhật và sử dụng thuộc tính MyClass của chúng để nhận giá trị hiện tại và tuần tự hóa nó thành thuộc tính chuỗi.

Điều bạn đang tìm kiếm là một số trường hợp ánh xạ phức tạp hoặc chuyển đổi được ánh xạ. EF không hỗ trợ họ nhưng bạn có thể bỏ phiếu cho đề nghị của tôi trên Data UserVoice.

+0

Thay vì sử dụng móc của Entity, bạn có thể làm cho trình thu thập đặc tính thực hiện tuần tự theo yêu cầu hay không, và trình gỡ rối thực hiện quá trình deserialization và cư trú phần còn lại của đối tượng? –

+0

@KevinKibler Điều đó có cùng vấn đề với giải pháp INotifyPropertyChanged nhưng nó sẽ hoạt động. – Casey

Các vấn đề liên quan