Вставить / обновить связанные данные с EF и WebAPI - контроллером - PullRequest
0 голосов
/ 11 марта 2020

У меня есть следующие классы

public class Contact
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string Address { get; set; }

    public ICollection<Phone> Phones { get; set; }

}

    public class Phone
    {
        public int Id { get; set; }
        public string Number { get; set; }

        public int ContactId { get; set; }
        public Contact Contact { get; set; }
    }

В одном контакте может быть много телефонных номеров. Мой контроллер контактов выглядит следующим образом

    [Produces("application/json")]
    [Route("api/Contacts")]
    public class ContactsController : Controller
    {
        private readonly IDataAccessProvider _dataAccessProvider;

        public ContactsController(IDataAccessProvider dataAccessProvider)
        {
            _dataAccessProvider = dataAccessProvider;
        }

        [HttpGet]
        [Route("api/Contacts/Get")]
        public IEnumerable<Contact> Get()
        {
            return _dataAccessProvider.GetAllContacts();
        }

        [HttpPost]
        [Route("api/Contacts/Create")]
        public void Create([FromBody]Contact Contact)
        {
            if (ModelState.IsValid)
            {
                //Guid obj = Guid.NewGuid();
                //Contact.Id = obj;
                _dataAccessProvider.AddContact(Contact);
            }
        }

IDataAccessProvider - это интерфейс с методами Добавить / Удалить / Получить.

    public interface IDataAccessProvider
    {
        void AddContact(Contact contact);
        void UpdateContact(Contact contact);
        void DeleteContact(int id);
        Contact GetContact(int id);
        List<Contact> GetAllContacts();
    }

Моя проблема заключается в том, как реализовать все это, но с Класс телефона . Как добавить несколько телефонных номеров через PhoneController?

Все еще учусь. NET Ядро, так что будьте осторожны:)

1 Ответ

0 голосов
/ 12 марта 2020

Как добавить несколько телефонных номеров через PhoneController?

Вот пример, на который можно сослаться:

[HttpPost]
public async Task<ActionResult<Phone>> PostPhone(List<Phone> phone)
{
    foreach(var item in phone)
    {
        _context.Phone.Add(item);
    }
    await _context.SaveChangesAsync();

    return RedirectToAction("GetPhone");//do your stuff...
}

Почтальон : нет необходимости передавать Id. Но поскольку ContactId является внешним ключом, вам нужно передать ContactId ( Примечание : убедитесь, что ContactId exsits). enter image description here

Моя проблема заключается в том, как реализовать все это, но с использованием класса телефона.

1.Интерфейс:

public interface IDataAccessProvider
{
    void AddContact(Contact contact);
    void UpdateContact(Contact contact);
    void DeleteContact(int id);
    Contact GetContact(int id);
    List<Contact> GetAllContacts();
}

2.Implement:

public class DataAccessProvider : IDataAccessProvider
{
    private readonly YourContext _context;
    public DataAccessProvider(YourContext context)
    {
        _context = context;
    }
    public void AddContact(Contact contact)
    {
        _context.Contact.Add(contact);
        _context.SaveChanges();           
    }

    public void DeleteContact(int id)
    {
        var contact =  _context.Contact.Find(id);
        _context.Contact.Remove(contact);
        _context.SaveChanges();
    }

    public List<Contact> GetAllContacts()
    {
        return  _context.Contact.Include(c=>c.Phones).ToList();
    }

    public Contact GetContact(int id)
    {
        var contact = _context.Contact.Find(id);
        return contact;
    }

    public void UpdateContact(Contact contact)
    {
        foreach (var item in contact.Phones)
        {
            var flag = _context.Phone.Find(item.Id);
            //if you want to change the phone's value
            if (flag != null)
            {
                flag.Number = item.Number;
                _context.Entry(flag).State = EntityState.Modified;
                _context.SaveChanges();
            }
            //if the phone even does not exsit in Phone class
            //you need to create it
            else
            {
                _context.Phone.Add(item);
                _context.SaveChanges();
            }
        }
        _context.Entry(contact).State = EntityState.Modified;
        try
        {
             _context.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
                throw;              
        }
    }
}

3.Контроллер:

[Produces("application/json")]
[Route("api/Contacts")]
public class ContactsController : Controller
{
    private readonly IDataAccessProvider _dataAccessProvider;

    public ContactsController(IDataAccessProvider dataAccessProvider)
    {
        _dataAccessProvider = dataAccessProvider;
    }

    [HttpGet]
    [Route("api/Contacts/Get")]
    public IEnumerable<Contact> Get()
    {
        return _dataAccessProvider.GetAllContacts();
    }

    [HttpPost]
    [Route("api/Contacts/Create")]
    public void Create([FromBody]Contact Contact)
    {
        if (ModelState.IsValid)
        {              
            _dataAccessProvider.AddContact(Contact);
        }
    }
    [HttpPut]
    [Route("api/Contacts/Update")]
    public void Update([FromBody]Contact Contact)
    {
        if (ModelState.IsValid)
        {
            _dataAccessProvider.UpdateContact(Contact);
        }
    }
    [HttpDelete]
    [Route("api/Contacts/Delete")]
    public void Delete(int id)
    {
        if (ModelState.IsValid)
        {
            _dataAccessProvider.DeleteContact(id);
        }
    }
}

4.Как использовать Почтальон:

  • Создать

Не нужно передавать Id. Вы можете создать вместе с phone или просто создать contact enter image description here

  • Обновление

Вы можете изменить значение телефона в этом контакте. Вы также можете добавить новый телефон к этому контакту. enter image description here

  • Удалить

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...