2016-09-27 1 views
1

Я создаю WebAPI, и я заполнил свою базу данных 5 различными организациями, каждая организация имеет 3 разных контакта, каждый из которых имеет 3 телефонных номера с EntityFramework. Но почему-то ведет себя странным образом:Связи EntityFramework, дающие неверные результаты - WebAPI не принимает {id}

  • я получаю полный список контактов и организаций
  • я просто контакт под организацией (GET -> API/организации)
  • я просто один телефон под контактом (GET -> api/contacts)
  • Он не принимает параметр в маршрутах api, таких как: api/contacts/{id} или api/organization {id}. Он возвращает код 404.

Мои вопросы:

1- ли связь между моделями неправильно построены и поэтому я получаю только один вспомогательный элемент, а не весь список?

2- Почему мои маршруты не принимают параметры {id}?

Это мои модели:

**Organization:** 
public class Organization { 
     public Guid Id { get; set; } 
     public DateTime dateCreated { get; set; } 
     public string organizationName { get; set; } 
     public virtual ICollection<Contact> Contacts { get; set; } 
    } 

**Contact:** 
public class Contact { 
     public Contact() { } 
     public Guid Id { get; set; } 
     public string firstName { get; set; } 
     public string lastName { get; set; } 
     public virtual ICollection<Phone> Phones { get; set; } 

     // Foreign Key for Organizations 
     public Guid OrganizationId { get; set; } 

     //Related Organization entity 
     [ForeignKey("OrganizationId")] 
     public Organization OrganizationData { get; set; } 
    } 

**Phones:** 
public class Phone { 
     public Guid Id { get; set; } 
     public string customName { get; set; } 
     public string phoneNumber { get; set; } 

     // Foreign Key for Contacts 
     public Guid ContactId { get; set; } 

     //Related Contact entity 
     [ForeignKey("ContactId")] 
     public Contact ContactData { get; set; } 
    } 

Это мои контроллеры:

**OrganizationsController:** 
    [Route("api/organizations")] 
    public class OrganizationsController : Controller 
    { 
      [HttpGet ("")] 
     public IActionResult Get() 
     { 
       var results = _repository.GetAllOrganizations(); 
       return Ok(Mapper.Map<IEnumerable<Organization>>(results)); 
     } 

[HttpGet("")] 
     public IActionResult Get(Guid Id) 
     { 
       var organization = _repository.GetOrganizationById(Id); 
       return Ok(organization); 
     } 
    } 

**ContactsController** 
[Route("api/organization/{id}/contacts")] 
    public class ContactsController : Controller 
    { 

     [HttpGet("")] 
     public IActionResult Get(Guid Id) 
     { 
       var organization = _repository.GetOrganizationById(Id); 
       return Ok(organization.Contacts.ToList()); 
     } 
     } 
    } 

**AllContactsController** 
[Route("api/contacts")] 
     public class AllController : Controller 
     { 
     [HttpGet("")] 
     public IActionResult Get() 
     { 
       var results = _repository.GetAllContacts(); 
       return Ok(Mapper.Map<IEnumerable<Contact>>(results)); 
     } 

     [HttpGet("/{id}")] 
     public IActionResult Get(Guid Id) 
     { 
       var contact = _repository.GetContactById(Id); 
       return Ok(contact); 
     } 

EDIT: добавление репозитория:

public class ContactManagementRepository : IContactManagementRepository 
    { 
     private ContactManagementContext _context; 
     private ILogger<ContactManagementRepository> _logger; 

     public ContactManagementRepository(ContactManagementContext context, ILogger<ContactManagementRepository> logger) 
     { 
      _context = context; 
      _logger = logger; 
     } 

     public IEnumerable<Organization> GetAllOrganizations() 
     { 
      _logger.LogInformation("Getting All Organizations from the Database"); 
      return _context.Organizations.ToList(); 
     } 

     public IEnumerable<Contact> GetAllContacts() 
     { 
      _logger.LogInformation("Getting All Contacts from the Database"); 
      return _context.Contacts.ToList(); 
     } 

     public void AddOrganization(Organization organization) 
     { 
      _context.Add(organization); 
     } 

     public void AddContact(Guid id, Contact newContact) 
     { 
      var organization = GetOrganizationById(id); 
      if(organization != null) 
      { 
       organization.Contacts.Add(newContact); 
       _context.Contacts.Add(newContact); 
      } 
     } 

     public async Task<bool> SaveChangesAsync() 
     { 
      return (await _context.SaveChangesAsync()) > 0; 
     } 

     public Organization GetOrganizationById(Guid Id) 
     { 
      return _context.Organizations 
       .Include(c => c.Contacts) 
       .Where(c => c.Id == Id) 
       .FirstOrDefault(); 
     } 

     public Contact GetContactById(Guid Id) 
     { 
      return _context.Contacts 
       .Include(c => c.Addresses) 
       .Include(c => c.Bankdatas) 
       .Include(c => c.Phones) 
       .Where(c => c.Id == Id) 
       .FirstOrDefault(); 
     } 

     public void DeleteContact(Guid id) 
     { 
      var contact = GetContactById(id); 
      if (contact != null) 
      { 
       _context.Contacts.Remove(contact); 
      } 
     } 
    } 
+0

Хранилища выглядят хорошо для меня тоже. Можете ли вы уточнить свой вопрос? Что именно вы отправили и что возвращается? – DmitryBLR

+0

Я получаю список всех контактов и всех организаций, но когда я пытаюсь получить данные из одной организации (с ее тремя контактами), я просто получаю ОДИН контакт. то же самое для контактов, где я просто получаю ОДИН телефон. –

ответ

0

Попробуйте OrganizationsController

[HttpGet("{id}")] 
public IActionResult Get(Guid Id) 
{ 
     var organization = _repository.GetOrganizationById(Id); 
     return Ok(organization); 
} 

и попробовать AllController

[HttpGet("{id}")] 
public IActionResult Get(Guid Id) 
{ 
     var contact = _repository.GetContactById(Id); 
     return Ok(contact); 
} 

Ваши модели выглядят хорошо для меня. Можете ли вы показать свои репозитории?

+0

Конечно, я добавил репозиторий –

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