使用EF和WebAPI-控制器插入/更新相关数据

问题描述 投票:0回答:1

我有以下课程

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是与Add / Delete / Get方法的接口。

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

我的问题是如何使用Phone class来实现所有这些。如何通过PhoneController添加多个电话号码?

仍在学习.NET Core,请保持温柔:)

.net asp.net-web-api entity-framework-core asp.net-core-webapi one-to-many
1个回答
0
投票

如何通过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是外键,因此您需要传递ContactIdNote:确保已经存在ContactId)。enter image description here

我的问题是如何用Phone类实现所有这些。

1。接口:

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

2。实现:

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.Controller:

[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一起创建,也可以只创建contactenter image description here

  • 更新

您可以更改此联系人中电话的值。也可以向此联系人添加新电话。enter image description here

  • 删除

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.