(ModelBuilder modelBuilder)
| 28 | public DbSet<BoardAutomation> BoardAutomations { get; set; } |
| 29 | |
| 30 | protected override void OnModelCreating(ModelBuilder modelBuilder) |
| 31 | { |
| 32 | base.OnModelCreating(modelBuilder); |
| 33 | |
| 34 | // User |
| 35 | modelBuilder.Entity<User>(entity => |
| 36 | { |
| 37 | entity.HasIndex(u => u.Username).IsUnique(); |
| 38 | entity.HasIndex(u => u.Email).IsUnique(); |
| 39 | }); |
| 40 | |
| 41 | // Board -> User |
| 42 | modelBuilder.Entity<Board>(entity => |
| 43 | { |
| 44 | entity.HasOne(b => b.Owner) |
| 45 | .WithMany(u => u.Boards) |
| 46 | .HasForeignKey(b => b.OwnerId) |
| 47 | .OnDelete(DeleteBehavior.Cascade); |
| 48 | }); |
| 49 | |
| 50 | // Column -> Board |
| 51 | modelBuilder.Entity<Column>(entity => |
| 52 | { |
| 53 | entity.HasOne(c => c.Board) |
| 54 | .WithMany(b => b.Columns) |
| 55 | .HasForeignKey(c => c.BoardId) |
| 56 | .OnDelete(DeleteBehavior.Cascade); |
| 57 | }); |
| 58 | |
| 59 | // TaskCard -> Column |
| 60 | modelBuilder.Entity<TaskCard>(entity => |
| 61 | { |
| 62 | entity.HasOne(t => t.Column) |
| 63 | .WithMany(c => c.TaskCards) |
| 64 | .HasForeignKey(t => t.ColumnId) |
| 65 | .OnDelete(DeleteBehavior.Cascade); |
| 66 | }); |
| 67 | |
| 68 | // TaskActivity -> TaskCard |
| 69 | modelBuilder.Entity<TaskActivity>(entity => |
| 70 | { |
| 71 | entity.HasIndex(a => a.TaskCardId); // Optimization |
| 72 | |
| 73 | entity.HasOne(a => a.TaskCard) |
| 74 | .WithMany() // TaskCard doesn't need explicit list of activities for now, can query by ID |
| 75 | .HasForeignKey(a => a.TaskCardId) |
| 76 | .OnDelete(DeleteBehavior.Cascade); |
| 77 | |
| 78 | entity.HasOne(a => a.User) |
| 79 | .WithMany() |
| 80 | .HasForeignKey(a => a.UserId) |
| 81 | .OnDelete(DeleteBehavior.Cascade); |
| 82 | }); |
| 83 | |
| 84 | // BoardMember (User <-> Board many-to-many) |
| 85 | modelBuilder.Entity<BoardMember>(entity => |
| 86 | { |
| 87 | entity.HasOne(bm => bm.User) |
nothing calls this directly
no outgoing calls
no test coverage detected