2015-07-08 4 views
2

Я разрабатываю приложение ASP.Net MVC5 с использованием Web API 5, OData и Entity Framework 6. Я создал репозитории и использовал инструменты Entity Framework Power Tools для генерации моего объекта моделей. Я отключил ленивую загрузку и создание прокси на моем DBContext. Ниже описано, как я пишу свои запросы LINQ в классах репозитория для возврата объектов с отношениями;ASP.Net WebAPI Ответ JSON не сериализует отношения сущностей

  return repository 
      .Query(i => i.IsTransaction == true) 
      .Include(i => i.SubInventory) 
      .Include(c => c.Contact)     
      .OrderBy(q => q 
       .OrderBy(i => i.ItemFullCode))     
      .Select(); 

Далее в моем файле ODataConfig, который я установил;

config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling 
      = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling 
      = Newtonsoft.Json.PreserveReferencesHandling.Objects; 

Вопрос, который я борюсь с, что мой метод Web API JSON ответ не содержит отношения, которые включены в LINQ запроса, но только основные данные сущности. Любая идея, что мне здесь не хватает?

Ниже приведен код моего основного объекта.

public partial class Item : Entity 
{ 
    public Item() 
    { 
     this.DocumentDatas = new List<DocumentData>(); 
     this.ItemColorSizes = new List<ItemColorSize>(); 
     this.ItemPrices = new List<ItemPrice>(); 
     this.Items1 = new List<Item>(); 
     this.ItemStocks = new List<ItemStock>(); 
     this.SeasonalSaleDetails = new List<SeasonalSaleDetail>(); 
    } 

    public string ItemFullCode { get; set; } 
    public string ItemCode { get; set; } 
    public string ItemName { get; set; } 
    public string ItemShortCode { get; set; } 
    public string LevelItemFullCode { get; set; } 
    public string SupplierCode { get; set; } 
    public string SubInvCode { get; set; } 
    public Nullable<decimal> PurchasePrice { get; set; } 
    public Nullable<decimal> SalePrice { get; set; } 
    public Nullable<System.DateTime> ArrivalDate { get; set; } 
    public string RefCode { get; set; } 
    public Nullable<decimal> TColumn { get; set; } 
    public Nullable<bool> TColumnByAmt { get; set; } 
    public Nullable<bool> IsGiftItem { get; set; } 
    public Nullable<bool> IsTransaction { get; set; } 
    public Nullable<bool> IsActive { get; set; } 
    public string CreatedBy { get; set; } 
    public Nullable<System.DateTime> CreatedDate { get; set; } 
    public string ModifiedBy { get; set; } 
    public Nullable<System.DateTime> ModifiedDate { get; set; } 
    public Contact Contact { get; set; } 
    public ICollection<DocumentData> DocumentDatas { get; set; } 
    public ICollection<ItemColorSize> ItemColorSizes { get; set; } 
    public ICollection<ItemPrice> ItemPrices { get; set; } 
    public ICollection<Item> Items1 { get; set; } 
    public Item Item1 { get; set; } 
    public SubInventory SubInventory { get; set; } 
    public ICollection<ItemStock> ItemStocks { get; set; } 
    public ICollection<SeasonalSaleDetail> SeasonalSaleDetails { get; set; } 
} 
+0

Не могли бы вы дать нам представление о том, как выглядит определение 'repository'? Также вы могли бы подтвердить, что в коде, когда вы установите точку останова после этого возврата, все ожидаемые связанные объекты были десериализованы. Мое подозрение в том, что эта функция не применяется к отношениям сущностей. Мой опыт в этом заключался в том, что если бы у вас была рекурсивная структура, вам это нужно. Подобно типу, который ссылается на массив того же типа. – evanmcdonnal

+2

Вы используете код первым? Можете ли вы отобразить свои сущности? – ESG

+0

@evanmcdonnal Я использовал архитектуру, объясненную ниже ссылкой http://blog.longle.net/2013/05/11/genericizing-the-unit-of-work-pattern-repository-pattern-with-entity-framework- in-mvc/ Я установил точку прерывания и даже сериализовал возвращаемый объект из репозитория, содержащий все связанные объекты. Только на стороне клиента я не получаю JSON, состоящий из всех объектов. –

ответ

1

Если вы используете запрос OData, вы можете использовать свойство $ expand, чтобы получить ссылку, включенную в ваш ответ. .

GET http://localhost/odata/Products(1)?$expand=Products/Supplier

будет приводить к загрузке данных Поставщика, а не просто возвращается идентификатор поставщика.

{ 
    "odata.metadata":"http://localhost/odata/$metadata#Categories/@Element", 
    "Products":[ 
    { 
     "Supplier":{"Key":"CTSO","Name":"Contoso, Ltd."}, 
     "ID":1,"Name":"Hat","Price":"15.00","CategoryId":1,"SupplierId":"CTSO" 
    }, 
    { 
     "Supplier":{"Key":"CTSO","Name":"Contoso, Ltd."}, 
     "ID":2,"Name":"Scarf","Price":"12.00","CategoryId":1,"SupplierId":"CTSO" 
    },{ 
     "Supplier":{ 
     "Key":"FBRK","Name":"Fabrikam, Inc." 
     },"ID":3,"Name":"Socks","Price":"5.00","CategoryId":1,"SupplierId":"FBRK" 
    } 
    ],"ID":1,"Name":"Apparel" 
} 

Подробнее об этом article.

+0

спасибо за ответ. Он решил проблему. –

Смежные вопросы