2011-12-21 32 views
7

Tôi đang sử dụng JSON.net để sắp xếp các đối tượng EntityFramework của mình.JSON.net JsonIgnoreAttribute không hoạt động với thuộc tính "EntityKey"

Trước đây, tôi đã tạo một lớp áp dụng thuộc tính "JsonIgnore" cho thuộc tính và sau đó tôi đặt thuộc tính "MetadataType" của lớp EntityFramework chính của tôi thành lớp mới được tạo.

Dưới đây là một ví dụ:

Lớp sẽ được áp dụng cho các lớp EF:

public class Role_DoNotSerialize 
    { 
     [JsonIgnore] 
     public string Users { get; set; } 
    } 

File partial class cho lớp EF:

[MetadataType(typeof(Role_DoNotSerialize))] 
    public partial class Role 
    { 
    } 

Ở phía trên Ví dụ, thuộc tính "Người dùng" sẽ không được tuần tự hóa khi tuần tự hóa một đối tượng "Vai trò".

Vấn đề của tôi là, cùng kỹ thuật này không làm việc khi tôi thêm vào tài sản EntityKey như vậy:

public class Role_DoNotSerialize 
    { 
     [JsonIgnore] 
     public string Users { get; set; } 

     [JsonIgnore] 
     public System.Data.EntityKey EntityKey { get; set; } 
    } 

Sử dụng lớp này, "EntityKey" bất động sản vẫn còn serialized. Tôi đang làm gì sai?

+0

Được viết và làm việc tốt. Vâng, hai bit hàng đầu có nghĩa vụ phải làm việc, đó là. –

+0

Tìm câu trả lời cho câu hỏi của tôi bằng câu hỏi của bạn! +1 – theMothaShip

Trả lời

4

bạn có thể làm điều này bằng cách thực hiện riêng ContractResolver của bạn (ví dụ mã với JSON.NET 4.5, nhưng cũng có thể với phiên bản cũ)

public class ExcludeEntityKeyContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> properties = base.CreateProperties(type,memberSerialization); 
     return properties.Where(p => p.PropertyType != typeof (System.Data.EntityKey)).ToList(); 
    } 
} 

sau đó bạn có thể thiết lập này để thiết lập ContractResolver cho JsonSerializerSettings bạn phản đối

JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); 
serializerSettings.ContractResolver = new ExcludeEntityKeyContractResolver(); 

Lưu ý rằng bạn không bị giới hạn chỉ một hàm lambda mà bạn có thể thực hiện bất kỳ loại séc nào bạn muốn. Bạn thậm chí có thể ghi đè Chuyển đổi cho mỗi thuộc tính để thực hiện tuần tự hóa tùy chỉnh.

2

Tôi nghĩ rằng các phiên bản mới nhất của JSON.NET tôn vinh điều này ngay bây giờ. Mẫu này làm việc cho chúng tôi trong một trang web MVC, nhưng bạn có thể sử dụng chuỗi tuy nhiên bạn muốn.

public ActionResult ContentJsonFormatted(object obj, Formatting formatting = Formatting.Indented) 
{ 
    string result = JsonConvert.SerializeObject(obj, formatting); 
    return Content(result, "text/plain"); 
} 
Các vấn đề liên quan