2016-12-20 4 views
0

Я использую Entity Framework 6 для построения модели БД. У меня есть также веб-сервис построен на Web Api 2 с JSON ..C# WebApi 2. Серийная обработка JSON. Исключить свойство из частичных классов

Мое главное определение частичного класса выглядит следующим образом: (Сформирован из EF (первый код из БД), поэтому я не хочу, чтобы хранить здесь слишком много изменений)

public partial class Animal 
{ 
    [Key] 
    [Column(Order = 0)] 
    public long AnimalId { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long SpeciesId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public string AnimalName{ get; set; } 

    public string AnimalDescription{ get; set; } 

    public List<AnimalTags> AnimalTags= new List<AnimalTags>(); 
} 

и я получил также еще один частичный класс с некоторыми дополнительными свойствами, которые я не хочу, чтобы показать через Web Api.

public partial class Animal 
{ 
    [JsonIgnore] 
    public bool IsNew { get; set; } = false; 
    [JsonIgnore] 
    public bool IsChanged { get; set; } = false; 
} 

Это мой AnimalController:

public IHttpActionResult GetAnimals(long id) 
{ 
    Animal animal = (from an in db.Animal 
         where a.AnimalId == id 
         select a).FirstOrDefault(); 

    animal.AnimalsTags= db.AnimalTags.Where(at=> at.AnimalId == animal.AnimalId).ToList(); 

    if (animal == null) 
    { 
     return NotFound(); 
    } 

    return Ok(animal); 
} 

Я проверил все предлагаемое решение на SO и MSDN, но эти атрибуты не работают. Возможно, я ошибся где-то в другом месте?

Спасибо за любую помощь.

Редактировать: DB Model находится в другом проекте, а WebService - в другом, поэтому я привязываю DB Model к WebService через ссылку.

Как мой класс регистра выглядит с Newtonsoft.Json:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
       name: "DataApi", 
       routeTemplate: "api/{controller}/{Id}", 
       defaults: new { Id = RouteParameter.Optional } 
     ); 
     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
     config.Formatters.JsonFormatter.SerializerSettings = 
      new JsonSerializerSettings 
      { 
       NullValueHandling = NullValueHandling.Ignore, 
       Formatting = Formatting.Indented 
      }; 
    } 
+0

вы пытались [NotMapped]? – MMK

+0

@MMK: Да. Но безуспешно. – Wiktor

+0

[ScriptIgnore (ApplyToOverrides = true)] – MMK

ответ

0

Я думаю, что вы ищете [JsonIgnore] для Json serializer или [IgnoreDataMember] по умолчанию XML сериализатором в.

Но я вижу в вашем коде, который вы используете [DataContract], вы определенно можете сделать это также:

[DataContract] 
public class YourClass 
{ 
    [DataMember] 
    public int Id { get; set; } 
    [DataMember] 
    public string Prop1 { get; set; } 

    //ignored 
    public string IgnoredProp { get;set; } 
} 
+0

Я не использую Json.NET, я использую DataContractJsonSerializer. Так что я не могу нас [JsonIgnore]. И ко второй части, как вы можете видеть, в частичном классе у меня нет атрибутов [DataMember]. – Wiktor