Cataloguer les revues : une fiche, ses numéros à l'intérieur
Clôt la décision du premier lot, qui écartait les périodiques faute de modèle. Douze numéros d'un magazine ne font plus douze fiches identiques. Table à part, pour la troisième fois et pour le même motif que la liste d'envies et les séries : logée dans Livres, une revue entrerait dans le catalogue, ses compteurs, les doublons et les bibliographies, et il faudrait écrire « et qui n'est pas une revue » à chaque lecture. Un numéro est recensé, rien de plus — ni prêt ni statut, tous deux liés à Livre par clé étrangère. Réversible. « Créer ou retrouver » et non « créer » : scanner le numéro suivant du même magazine retombe forcément sur la même revue. L'unicité de l'ISSN est un index partiel, sans quoi les revues sans ISSN se bloqueraient entre elles. Le flux 977 mène désormais à la fiche de la revue, et ne pré-remplit plus le formulaire d'un livre. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -32,6 +32,14 @@ public class MaBibliDbContext(DbContextOptions<MaBibliDbContext> options) : DbCo
|
||||
|
||||
public DbSet<ElementSerie> ElementsSerie => Set<ElementSerie>();
|
||||
|
||||
/// <summary>
|
||||
/// Revues et magazines. <b>Table séparée des <see cref="Livres"/></b> : une revue n'est pas
|
||||
/// un livre, et n'a rien à faire dans le catalogue, ses compteurs ou ses doublons.
|
||||
/// </summary>
|
||||
public DbSet<Revue> Revues => Set<Revue>();
|
||||
|
||||
public DbSet<NumeroRevue> NumerosRevue => Set<NumeroRevue>();
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
base.OnModelCreating(modelBuilder);
|
||||
@@ -177,6 +185,38 @@ public class MaBibliDbContext(DbContextOptions<MaBibliDbContext> options) : DbCo
|
||||
.HasFilter("\"LivreId\" IS NOT NULL");
|
||||
});
|
||||
|
||||
modelBuilder.Entity<Revue>(revue =>
|
||||
{
|
||||
revue.Property(r => r.Titre).IsRequired();
|
||||
revue.Property(r => r.TitreNormalise).IsRequired();
|
||||
|
||||
revue.HasIndex(r => r.TitreNormalise).IsUnique();
|
||||
|
||||
// Index PARTIEL : une revue peut n'avoir aucun ISSN (saisie à la main), et deux
|
||||
// NULL étant distincts pour SQLite, une unicité simple ne dirait rien. Filtré, il
|
||||
// garantit qu'un ISSN connu ne désigne qu'une fiche — ce qui permet au flux « 977 »
|
||||
// de retrouver la revue déjà créée au lieu d'en faire une seconde.
|
||||
revue.HasIndex(r => r.Issn, "IX_Revues_Issn")
|
||||
.IsUnique()
|
||||
.HasFilter("\"Issn\" IS NOT NULL");
|
||||
});
|
||||
|
||||
modelBuilder.Entity<NumeroRevue>(numero =>
|
||||
{
|
||||
numero.Property(n => n.Numero).IsRequired();
|
||||
numero.Property(n => n.NumeroNormalise).IsRequired();
|
||||
|
||||
numero.HasOne(n => n.Revue)
|
||||
.WithMany(r => r.Numeros)
|
||||
.HasForeignKey(n => n.RevueId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
|
||||
// Un numéro ne se possède qu'une fois par revue : rescanner le même exemplaire ne
|
||||
// doit pas allonger la liste. Contrairement aux livres, un second exemplaire d'un
|
||||
// numéro de magazine n'a pas d'usage identifié — et l'index se retire si un jour si.
|
||||
numero.HasIndex(n => new { n.RevueId, n.NumeroNormalise }).IsUnique();
|
||||
});
|
||||
|
||||
modelBuilder.Entity<Pret>(pret =>
|
||||
{
|
||||
pret.Property(p => p.Emprunteur).IsRequired();
|
||||
|
||||
Reference in New Issue
Block a user