Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var _emails = await _context.Email
- .Where(e =>
- e.PersonId == person.Id &&
- person.Emails
- .Where(i => i.Id == e.Id)
- .Count() == 0)
- .ToListAsync();
- _context.Email.RemoveRange(_emails);
- _context.Person.Update(person);
- await _context.SaveChangesAsync();
- namespace ProjectNS.Models {
- public partial class Ctx : DbContext {
- public virtual DbSet<Address> Address { get; set; }
- public virtual DbSet<Email> Email { get; set; }
- public virtual DbSet<Person> Person { get; set; }
- public virtual DbSet<Phone> Phone { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder) {
- // Address и Phone пропущены для экономии места (выглядят аналогично)
- modelBuilder.Entity<Email>(entity => {
- // Описание свойств пропущено для экономии места
- entity.HasOne(d => d.Person)
- .WithMany(p => p.Emails)
- .HasForeignKey(d => d.PersonId)
- .HasConstraintName("FK_Email_Person");
- });
- modelBuilder.Entity<Person>(entity => {
- // Описание свойств пропущено для экономии места
- entity.HasOne(d => d.CompanyNavigation)
- .WithMany(p => p.Person)
- .HasForeignKey(d => d.CompanyId)
- .OnDelete(DeleteBehavior.Cascade)
- .HasConstraintName("FK_Person_Company");
- });
- }
- }
- public partial class Person {
- public int Id { get; set; }
- // ничего особенного
- public ICollection<Address> Addresses { get; set; }
- public ICollection<Phone> Phones { get; set; }
- public ICollection<Email> Emails { get; set; }
- }
- // Address и Phone пропущены для экономии места (выглядят аналогично)
- public partial class Email {
- public int Id { get; set; }
- // ничего особенного
- public int? PersonId { get; set; }
- public Person Person { get; set; }
- }
- }
- namespace ProjectNS.Controllers {
- public class PeopleController : Controller {
- private readonly Ctx _context;
- public PeopleController(Ctx context) {
- _context = context;
- }
- // Другие методы пропущены для экономии места
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<IActionResult> Edit(int id, [Bind("Id,...,Emails,Phones,Addresses")] Person person) {
- if (id != person.Id) {
- return NotFound();
- }
- if (ModelState.IsValid) {
- try {
- // Вот здесь начинается "танец с бубном"
- // для удаления несуществующих сущностей из БД
- var _emails = await _context.Email
- .Where(e =>
- e.PersonId == person.Id &&
- person.Emails
- .Where(i => i.Id == e.Id)
- .Count() == 0)
- .ToListAsync();
- _context.Email.RemoveRange(_emails);
- _context.Person.Update(person);
- await _context.SaveChangesAsync();
- }
- catch (DbUpdateConcurrencyException) {
- if (!PersonExists(person.Id)) {
- return NotFound();
- } else {
- throw;
- }
- }
- return RedirectToAction(nameof(Index));
- }
- ViewData[nameof(Person.CompanyId)] = new SelectList(_context.Company, nameof(Company.Id), nameof(Company.Name), person.CompanyId);
- return View(person);
- }
- }
- }
- public static IEnumerable<T> Except<T, TKey>(this IEnumerable<T> items,
- Enumerable<T> other,
- Func<T, TKey> getKey)
- {
- return from item in items
- join otherItem in other on getKey(item)
- equals getKey(otherItem) into tempItems
- where !tempItems.Any()
- select item;
- }
- var model = new List<Phone>();
- model.Add(new Test() {Number = 1);
- model.Add(new Test() {Number = 2);
- model.Add(new Test() {Number = 3);
- model.Add(new Test() {Number = 12);
- var source = new List<Phone>();
- source.Add(new Test() {Number = 1});
- source.Add(new Test() {Number = 2});
- source.Add(new Test() {Number = 3});
- source.Add(new Test() {Number = 4});
- var added = source.Except(model, key=>key.Number);
- var deleted = model.Except(source, key=>Key.Number);
Add Comment
Please, Sign In to add comment