· 6 years ago · Jan 05, 2020, 12:42 PM
1//CONTROLLER:
2 [HttpPost("{guid}/dashboard/absence/{startDate}/{endDate}/type/{absenceType}")]
3 public async Task<ActionResult<TakenAbsence>> AddAbsence(Guid guid, DateTime startDate, DateTime endDate,
4 string absenceType)
5 {
6 var usersHelper = new UsersHelper(_context);
7 if (!await usersHelper.IsGuidCorrect(guid)) return new NotFoundResult();
8 var newTakenAbsence = new TakenAbsence()
9 {
10 UserId = guid,
11 AbsenceId = await _context.Absences
12 .Where(x => x.Name == absenceType)
13 .Select(x => x.Id)
14 .SingleOrDefaultAsync(),
15 IsAccepted = false,
16 StartDate = startDate,
17 EndDate = endDate,
18 DaysCount = (int) (endDate - startDate).TotalDays
19 };
20
21 _context.TakenAbsences.Add(newTakenAbsence);
22 await _context.SaveChangesAsync();
23
24 return new OkObjectResult(newTakenAbsence);
25 }
26
27//ABSENCE MODEL:
28 public class Absence
29 {
30 public int Id { get; set; }
31 public string Name { get; set; }
32 public bool IsWork { get; set; }
33 public double SalaryPercent { get; set; }
34 public string RepresentingColor { get; set; }
35
36 [JsonIgnore]
37 public ICollection<TakenAbsence> TakenAbsences { get; set; }
38 }
39
40//USER MODEL:
41 public class User
42 {
43 public Guid Id { get; set; }
44 public string FirstName { get; set; }
45 public string LastName { get; set; }
46 [JsonIgnore]
47 public string Password { get; set; }
48 public string Email { get; set; }
49 public int Points { get; set; }
50 public int VacationDaysLeft { get; set; }
51 public string PhotoPath { get; set; }
52
53 public ICollection<TakenAbsence> TakenAbsences { get; set; }
54
55 [JsonIgnore]
56 public int PositionId { get; set; }
57 public Position Position { get; set; }
58
59 public ICollection<Task> Tasks { get; set; }
60
61 [JsonIgnore]
62 public int TeamId { get; set; }
63 public Team Team { get; set; }
64 }
65
66//TAKEN ABSENCES MODEL
67 public class TakenAbsence
68 {
69 public int Id { get; set; }
70 public int DaysCount { get; set; }
71 public bool IsAccepted { get; set; }
72 public DateTime StartDate { get; set; }
73 public DateTime EndDate { get; set; }
74
75 [JsonIgnore]
76 public int AbsenceId { get; set; }
77 public Absence Absence { get; set; }
78
79 [JsonIgnore]
80 public Guid UserId { get; set; }
81 [JsonIgnore]
82 public User User { get; set; }
83 }
84
85//FLUENT API:
86 modelBuilder.Entity<TakenAbsence>()
87 .HasKey(takenAbsence => new
88 {
89 takenAbsence.UserId, takenAbsence.AbsenceId
90 });
91
92 modelBuilder.Entity<TakenAbsence>()
93 .HasOne(takenAbsence => takenAbsence.User)
94 .WithMany(user => user.TakenAbsences)
95 .HasForeignKey(takenAbsence => takenAbsence.UserId)
96 .OnDelete(DeleteBehavior.Cascade);
97
98 modelBuilder.Entity<TakenAbsence>()
99 .HasOne(takenAbsence => takenAbsence.Absence)
100 .WithMany(absence => absence.TakenAbsences)
101 .HasForeignKey(takenAbsence => takenAbsence.AbsenceId)
102 .OnDelete(DeleteBehavior.Cascade);
103
104//CALL DO API:
105//POST https://localhost:5001/users/1f99527f-239f-4dbf-62e3-08d7855770ea/dashboard/absence/2020-03-01/2020-03-06/type/sick
106//BODY: {}
107
108//ERROR:
109Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
110 An unhandled exception has occurred while executing the request.
111Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_TakenAbsences'. Cannot insert duplicate key in object 'dbo.TakenAbsences'. The duplicate key value is (1f99527f-239f-4dbf-62e3-08d7855770ea, 1).
112
113//PROBLEM:
114//Absences i User łączą się relacją many to many w tabeli TakenAbsences.
115//Mam już jeden rekord z userem (jego guid podany w błędzie) w TakenAbsences i chce dodać kolejny, ale pokazuje, że chujnia
116//bo już istnieje taki user w tej tabeli. No czyli coś many to many tu nie działa