我有以下课程
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,请保持温柔:)
如何通过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
(Note:确保已经存在ContactId)。
我的问题是如何用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
一起创建,也可以只创建contact