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.
82 lines
3.4 KiB
C#
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);
|
|
}
|
|
}
|