2013-12-03 3 views
1

У меня есть простая база данных с пятью таблицами, связанными друг с другом отношениями. Я создал приложения OData раньше и, как модель, но хотел сделать скачок в веб-API. Проблема в том, что, например, когда я звоню в таблицу ProductType, она возвращает КАЖДУЮ запись в каждой таблице! Что дает?Web API - Entity Framework пытается разрушить мою жизнь

Моя цель состоит в том, чтобы вызвать ProductType, например, как это: URL/API/ProductType (и обычный GetByID, удалять и т.д.)

Я использую шаблон репозитория, и выполните следующие действия: 1. Создайте модель Entity Framework с таблицами, которые я хочу отобразить. Йон. 2. Добавьте интерфейс в Модели, назовите его IProductTypeRepository, с поведением, которое я хочу видеть. 3. Добавьте класс модели (ProductModel.cs), который наследуется от этого интерфейса 4. Убедитесь, что у Global.asax есть либо установка по умолчанию api, либо класс App_Start \ Routeconfig и WebApiConfig. 5. Хирургия в классе ValuesController.

Возможно, это связано с незнанием того, как WebAPI должен работать с отношениями. Возможно, цель состоит в том, чтобы сделать один вызов службы - и получить КАЖДУЮ запись на нескольких таблицах (например, Product и ProductDetails). Если это так, я думаю, что документация могла бы быть более ясной в этом вопросе!

====================== = =============================== 0 0 сказать, что он содержит сущности и объединения для пяти таблиц - ProductType, Location, Process, Step и StepType. ProductType - очень простая таблица с полем ID, поле описания и поля № (MaterialMasterId).

Для IProductTypeRepository, вот мой код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Perceptive.Services.Models 
{ 
    interface IProductTypeRepository 
    { 
     IEnumerable<ProductType> GetAll(); 
     ProductType GetById(int ProductTypeID); 
     int Update(ProductType producttype); 
     ProductType Add(ProductType producttype); 
     void Delete(int ProductTypeId); 
    } 
} 

Для ProducTTypeModel: с использованием системы; с использованием System.Collections.Generic; с использованием System.Linq; с использованием System.Web;

namespace Perceptive.Services.Models 
{ 
    public class ProductTypeModel : IProductTypeRepository 
    { 

     private PCSEntities1 context = new PCSEntities1(); 

     public IEnumerable<ProductType> GetAll() 
     { 
      return context.ProductTypes; 
     } 

     public ProductType GetById(int ProductTypeId) 
     { 
      IQueryable<ProductType> producttypes = context.ProductTypes.Where(a => a.ProductTypeID == ProductTypeId); 
      return producttypes.FirstOrDefault(); 
     } 

     public int Update(ProductType producttype) 
     { 
      ProductType updateProductType = context.ProductTypes.FirstOrDefault(c => c.ProductTypeID == producttype.ProductTypeID); 
      updateProductType.Description = producttype.Description.Trim(); 
      updateProductType.MaterialMasterID = producttype.MaterialMasterID; 
      return context.SaveChanges(); 
     } 

     public ProductType Add(ProductType producttype) 
     { 
      var addedProductType = context.ProductTypes.Add(producttype); 
      context.SaveChanges(); 
      return addedProductType; 
     } 

     public void Delete(int producttypeid) 
     { 
      ProductType producttype = context.ProductTypes.FirstOrDefault(a => a.ProductTypeID == producttypeid); 
      context.ProductTypes.Remove(producttype); 
      context.SaveChanges(); 
     } 





    } 
} 

... и, наконец, мой контроллер - ProductTypeController.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
//dh added 
using Perceptive.Services.Models; 

namespace Perceptive.Services.Controllers 
{ 
    public class ProductTypeController : ApiController 
    { 
     IProductTypeRepository repository = new ProductTypeModel(); 

     // GET /api/Producttype 
     [HttpGet] 
     public IEnumerable<ProductType> Get() 
     { 
      return repository.GetAll(); 
     } 

     // GET /api/Producttype/5 
     [HttpGet] 
     public ProductType Get(int id) 
     { 
      ProductType producttype = repository.GetById(id); 
      return producttype; 
     } 

     // POST /api/ProducTtype 
     [HttpPost] 
     public void PostProductType(ProductType producttype) 
     { 
      repository.Add(producttype); 
     } 

     // PUT /api/ProductType 
     // DH seems scanty here. Where's the repository put? 
     [HttpPut] 
     public void PutProductType(ProductType producttype) 
     { 
      if (repository.Update(producttype) == 0) 
      { 
       throw new HttpResponseException(HttpStatusCode.NotFound); 
      } 
     } 

     //DELETE /api/ProductType/5 
     [HttpDelete] 
     public void Delete (int id) 
     { 
      repository.Delete(id); 
     } 
    } 
} 

ответ

2

Вы должны использовать IQueryable:

interface IProductTypeRepository 
    { 
     IQueryable<ProductType> GetAll(); 
     ProductType GetById(int ProductTypeID); 
     int Update(ProductType producttype); 
     ProductType Add(ProductType producttype); 
     void Delete(int ProductTypeId); 
    } 

При использовании IEnumerable он будет тянуть все записи на стороне клиента, а затем работать с ними. IQueryable обрабатывается как запрос до тех пор, пока вы не вызовете действие вроде .ToList(), которое выполнит запрос и вытащит результаты клиенту.

+0

Спасибо за последующие действия - к сожалению, это не работает. Я получаю результаты от обеих объединенных таблиц: [{"$ id": "1", "Процессы": [{"$ id": "2", "ProductType": {"$ ref": "1 "}," ProcessID ": 1," ProductTypeID ": 1," LocationID ": 2," ProcessName ":« First Inspection »,« ProcessNumber »:« S10 »,« ProcessOrder »: 10,« CreateByID »: 1, «CreateDate»: «2013-11-11T00: 00: 00», «EndDate»: null, «LastUpdateDate»: «2013-11-11T00: 00: 00», «ModifiedByID»: 1} – user3062620

+0

Вы получите все связанные данные по умолчанию. – Maess

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