Guest User

Untitled

a guest
Dec 12th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.93 KB | None | 0 0
  1. var _emails = await _context.Email
  2. .Where(e =>
  3. e.PersonId == person.Id &&
  4. person.Emails
  5. .Where(i => i.Id == e.Id)
  6. .Count() == 0)
  7. .ToListAsync();
  8. _context.Email.RemoveRange(_emails);
  9. _context.Person.Update(person);
  10. await _context.SaveChangesAsync();
  11.  
  12. namespace ProjectNS.Models {
  13. public partial class Ctx : DbContext {
  14.  
  15. public virtual DbSet<Address> Address { get; set; }
  16. public virtual DbSet<Email> Email { get; set; }
  17. public virtual DbSet<Person> Person { get; set; }
  18. public virtual DbSet<Phone> Phone { get; set; }
  19.  
  20. protected override void OnModelCreating(ModelBuilder modelBuilder) {
  21. // Address и Phone пропущены для экономии места (выглядят аналогично)
  22. modelBuilder.Entity<Email>(entity => {
  23. // Описание свойств пропущено для экономии места
  24. entity.HasOne(d => d.Person)
  25. .WithMany(p => p.Emails)
  26. .HasForeignKey(d => d.PersonId)
  27. .HasConstraintName("FK_Email_Person");
  28. });
  29. modelBuilder.Entity<Person>(entity => {
  30. // Описание свойств пропущено для экономии места
  31. entity.HasOne(d => d.CompanyNavigation)
  32. .WithMany(p => p.Person)
  33. .HasForeignKey(d => d.CompanyId)
  34. .OnDelete(DeleteBehavior.Cascade)
  35. .HasConstraintName("FK_Person_Company");
  36. });
  37. }
  38. }
  39. public partial class Person {
  40. public int Id { get; set; }
  41. // ничего особенного
  42. public ICollection<Address> Addresses { get; set; }
  43. public ICollection<Phone> Phones { get; set; }
  44. public ICollection<Email> Emails { get; set; }
  45. }
  46. // Address и Phone пропущены для экономии места (выглядят аналогично)
  47. public partial class Email {
  48. public int Id { get; set; }
  49. // ничего особенного
  50. public int? PersonId { get; set; }
  51. public Person Person { get; set; }
  52. }
  53. }
  54.  
  55. namespace ProjectNS.Controllers {
  56. public class PeopleController : Controller {
  57. private readonly Ctx _context;
  58. public PeopleController(Ctx context) {
  59. _context = context;
  60. }
  61. // Другие методы пропущены для экономии места
  62. [HttpPost]
  63. [ValidateAntiForgeryToken]
  64. public async Task<IActionResult> Edit(int id, [Bind("Id,...,Emails,Phones,Addresses")] Person person) {
  65.  
  66. if (id != person.Id) {
  67. return NotFound();
  68. }
  69.  
  70. if (ModelState.IsValid) {
  71. try {
  72.  
  73. // Вот здесь начинается "танец с бубном"
  74. // для удаления несуществующих сущностей из БД
  75. var _emails = await _context.Email
  76. .Where(e =>
  77. e.PersonId == person.Id &&
  78. person.Emails
  79. .Where(i => i.Id == e.Id)
  80. .Count() == 0)
  81. .ToListAsync();
  82. _context.Email.RemoveRange(_emails);
  83.  
  84. _context.Person.Update(person);
  85. await _context.SaveChangesAsync();
  86. }
  87. catch (DbUpdateConcurrencyException) {
  88. if (!PersonExists(person.Id)) {
  89. return NotFound();
  90. } else {
  91. throw;
  92. }
  93. }
  94. return RedirectToAction(nameof(Index));
  95. }
  96.  
  97. ViewData[nameof(Person.CompanyId)] = new SelectList(_context.Company, nameof(Company.Id), nameof(Company.Name), person.CompanyId);
  98. return View(person);
  99. }
  100. }
  101. }
  102.  
  103. public static IEnumerable<T> Except<T, TKey>(this IEnumerable<T> items,
  104. Enumerable<T> other,
  105. Func<T, TKey> getKey)
  106. {
  107. return from item in items
  108. join otherItem in other on getKey(item)
  109. equals getKey(otherItem) into tempItems
  110. where !tempItems.Any()
  111. select item;
  112. }
  113.  
  114.  
  115. var model = new List<Phone>();
  116. model.Add(new Test() {Number = 1);
  117. model.Add(new Test() {Number = 2);
  118. model.Add(new Test() {Number = 3);
  119. model.Add(new Test() {Number = 12);
  120.  
  121. var source = new List<Phone>();
  122. source.Add(new Test() {Number = 1});
  123. source.Add(new Test() {Number = 2});
  124. source.Add(new Test() {Number = 3});
  125. source.Add(new Test() {Number = 4});
  126.  
  127. var added = source.Except(model, key=>key.Number);
  128. var deleted = model.Except(source, key=>Key.Number);
Add Comment
Please, Sign In to add comment