Я создаю 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);
}
}
}
Хранилища выглядят хорошо для меня тоже. Можете ли вы уточнить свой вопрос? Что именно вы отправили и что возвращается? – DmitryBLR
Я получаю список всех контактов и всех организаций, но когда я пытаюсь получить данные из одной организации (с ее тремя контактами), я просто получаю ОДИН контакт. то же самое для контактов, где я просто получаю ОДИН телефон. –