У меня есть 3 класса модели: контакт, электронная почта и Телефон с отношениями «один ко многим».
Каждый контакт может иметь несколько адресов электронной почты и номеров телефонов.
Когда я пытался добавьте новый контакт через пользовательский интерфейс Swagger, я заметил, что он не сохраняет адреса электронной почты и номера телефонов, а только контактные данные. Я также попытался вручную добавить адрес электронной почты и номер телефона, и, попробовав это в пользовательском интерфейсе Swagger, я получил контактные данные, но снова с пустыми массивами адресов электронной почты и номеров телефонов...
Я опубликую мой код здесь, и, надеюсь, кто-нибудь увидит, где я напутал.
Заранее всем спасибо.
Код: Выделить всё
ContactController:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using incubis_assignment.Data;
using incubis_assignment.Models;
using System.Linq.Expressions;
using System.Diagnostics.Eventing.Reader;
namespace incubis_assignment.Controllers
{
[Route("api/[controller]")]
public class ContactController : ControllerBase
{
private readonly AppDbContext _context;
public ContactController(AppDbContext context)
{
_context = context;
}
[HttpGet]
public async Task GetContacts()
{
return await _context.Contacts.ToListAsync();
}
[HttpGet("{id}")]
public async Task GetOneContact(int id)
{
var contact = await _context.Contacts.FindAsync(id);
if (contact == null)
return NotFound();
return contact;
}
[HttpPost]
public async Task PostContact(Contact contact)
{
contact.Id = 0;
_context.Contacts.Add(contact);
await _context.SaveChangesAsync();
var resourceUrl = Url.Action(nameof(GetContacts), new { id = contact.Id });
return Created(resourceUrl, contact);
}
[HttpPut("{id}")]
public async Task PutContact(int id, [FromBody] Contact contact)
{
if (id != contact.Id)
return BadRequest();
_context.Entry(contact).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ContactExists(id))
return NotFound();
else
throw;
}
return NoContent();
}
[HttpDelete("{id}")]
public async Task DeleteContact(int id)
{
var contact = await _context.Contacts.FindAsync(id);
if (contact == null)
return NotFound();
_context.Contacts.Remove(contact);
await _context.SaveChangesAsync();
return NoContent();
}
private bool ContactExists(int id)
{
return _context.Contacts.Any(e => e.Id == id);
}
}
}
Код: Выделить всё
AppDbContext:
using Microsoft.EntityFrameworkCore;
using incubis_assignment.Models;
using System.Reflection.Metadata;
namespace incubis_assignment.Data;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions options) : base(options) { }
public DbSet Contacts { get; set; }
public DbSet Emails { get; set; }
public DbSet
Phones { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(c => c.Emails)
.WithOne(e => e.Contact)
.HasForeignKey(e => e.ContactId)
.IsRequired();
modelBuilder.Entity()
.HasMany(c => c.Phones)
.WithOne(p => p.Contact)
.HasForeignKey(p => p.ContactId)
.IsRequired();
}
}
Код: Выделить всё
Contact
Код: Выделить всё
namespace incubis_assignment.Models
{
public class Contact
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Address { get; set; }
public ICollection Emails { get; set; } = new List();
public ICollection
Phones { get; set; } = new List();
}
}
Код: Выделить всё
Email
Код: Выделить всё
namespace incubis_assignment.Models
{
public class Email
{
public int Id { get; set; }
public int ContactId { get; set; }
public string EmailAddress { get; set; }
public string Category { get; set; }
public Contact Contact { get; set; } // Navigacijsko svojstvo, nema potrebe za null!
}
}
Код: Выделить всё
Phone
Код: Выделить всё
namespace incubis_assignment.Models
{
public class Phone
{
public int Id { get; set; }
public int ContactId { get; set; }
public string PhoneNumber { get; set; }
public string Category { get; set; }
public Contact Contact { get; set; } // Navigacijsko svojstvo, nema potrebe za null!
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ew-contact