Files
MilkyShots/Lactose/Context/LactoseDbContext.cs
REDCODE 6d29f053f4 fix: proper bidirectional SharedWith many-to-many migration
Replace broken one-to-many User.AssetId shadow FK with proper
AssetUser join table using bidirectional navigation:
  HasMany(e => e.SharedWith).WithMany(e => e.SharedAssets)

Join table columns: SharedAssetsId (FK to Assets) + SharedWithId (FK to Users).
Adds SharedAssets navigation to User model.

Generated via dotnet ef migrations add.
2026-07-07 18:03:22 +02:00

82 lines
3.4 KiB
C#

using Lactose.Models;
namespace Lactose.Context;
/// <summary>
/// Entity Framework Core database context for the Lactose application.
/// </summary>
public class LactoseDbContext : DbContext {
/// <summary>
/// Gets or sets the assets DbSet.
/// </summary>
public DbSet<Asset> Assets { get; set; }
/// <summary>
/// Gets or sets the albums DbSet.
/// </summary>
public DbSet<Album> Albums { get; set; }
/// <summary>
/// Gets or sets the faces DbSet.
/// </summary>
public DbSet<Face> Faces { get; set; }
/// <summary>
/// Gets or sets the people DbSet.
/// </summary>
public DbSet<Person> People { get; set; }
/// <summary>
/// Gets or sets the users DbSet.
/// </summary>
public DbSet<User> Users { get; set; }
/// <summary>
/// Gets or sets the tags DbSet.
/// </summary>
public DbSet<Tag> Tags { get; set; }
/// <summary>
/// Gets or sets the folders DbSet.
/// </summary>
public DbSet<Folder> Folders { get; set; }
/// <summary>
/// Gets or sets the settings DbSet.
/// </summary>
public DbSet<Setting> Settings { get; set; }
/// <summary>
/// Gets or sets the job records DbSet.
/// </summary>
public DbSet<JobRecord> JobRecords { get; set; }
/// <summary>
/// Initialises a new instance of the <see cref="LactoseDbContext"/> class.
/// </summary>
/// <param name="options">The database context options.</param>
public LactoseDbContext(DbContextOptions options) : base(options) {}
/// <inheritdoc />
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.HasPostgresExtension("vector");
//Album Relationships
modelBuilder.Entity<Album>().HasOne(e => e.UserOwner).WithMany(e => e.OwnedAlbums);
modelBuilder.Entity<Album>().HasOne(e => e.PersonOwner).WithMany(e => e.Albums);
modelBuilder.Entity<Album>().HasMany(e => e.Assets).WithMany(e => e.Albums);
//Asset Relationships
modelBuilder.Entity<Asset>().HasOne(e => e.Owner).WithMany(e => e.OwnedAssets);
modelBuilder.Entity<Asset>().HasMany(e => e.SharedWith).WithMany(e => e.SharedAssets);
modelBuilder.Entity<Asset>().HasMany(e => e.Albums).WithMany(e => e.Assets);
modelBuilder.Entity<Asset>().HasMany(e => e.Tags).WithMany(e => e.Assets);
modelBuilder.Entity<Asset>().HasMany(e => e.Faces).WithOne(e => e.Asset);
modelBuilder.Entity<Asset>().HasOne(e => e.Folder).WithMany(e => e.Assets);
//Face Relationships
modelBuilder.Entity<Face>().HasOne(e => e.Asset).WithMany(e => e.Faces);
modelBuilder.Entity<Face>().HasOne(e => e.Person).WithMany(e => e.Faces);
//Person Relationships
modelBuilder.Entity<Person>().HasMany(e => e.Faces).WithOne(e => e.Person);
modelBuilder.Entity<Person>().HasMany(e => e.Albums).WithOne(e => e.PersonOwner);
//Tag Relationships
modelBuilder.Entity<Tag>().HasOne(e => e.Parent);
modelBuilder.Entity<Tag>().HasMany(e => e.Assets).WithMany(e => e.Tags);
//User Relationships
modelBuilder.Entity<User>().HasMany(e => e.OwnedAssets).WithOne(e => e.Owner);
modelBuilder.Entity<User>().HasMany(e => e.OwnedAlbums).WithOne(e => e.UserOwner);
//Folder Relationships
modelBuilder.Entity<Folder>().HasMany(e => e.Assets).WithOne(e => e.Folder);
}
}