ralmsdeveloper / EntityFrameworkCore.FirebirdSQL

FirebirdSQL database provider for Entity Framework Core.
Other
44 stars 26 forks source link

Scaffolding not accurate #46

Open RonaldGHempel opened 5 years ago

RonaldGHempel commented 5 years ago

The issue

When scaffolding an existing database, there are some issues with the generated classes.

  1. Columns marked as NOT NULL are generated as optional members.
  2. Unique index spreading over serveral columns isn't marked as unique. See index RDB$19 down below, which is not marked as IsUnique()

Steps to reproduce

Table definition

id (D_ID) INTEGER Not Null Stelle (D_ID) INTEGER Not Null Art (D_ErlaeuterungsArt) SMALLINT Not Null check (value >= 0) Nummer1 (D_Nummer) SMALLINT Not Null check (value >= -1) Nummer2 (D_Nummer) SMALLINT Not Null check (value >= -1) Nummer3 SMALLINT Nullable Txt1 (D_ID) INTEGER Not Null Txt2 (D_ID) INTEGER Not Null Txt3 INTEGER Nullable Anzahl_Init (D_Anzahl_Stelle_Positiv) DECIMAL(10, 2) Not Null default 0 check (value >= 0) Wegfall DATE Nullable Ersatzplanstelle (D_JaNein) CHAR(1) Not Null check (value in ('J','N')) Status SMALLINT Not Null CONSTRAINT FK_Erlaeuterungen_Stelle: Foreign key (Stelle) References Stelle (id) On Delete Cascade CONSTRAINT FK_Erlaeuterungen_TexteEbene1: Foreign key (Txt1) References TexteEbene1 (id) CONSTRAINT FK_Erlaeuterungen_TexteEbene2: Foreign key (Txt2) References TexteEbene2 (id) CONSTRAINT FK_Erlaeuterungen_TexteEbene3: Foreign key (Txt3) References TexteEbene3 (id) CONSTRAINT PK_Erlaeuterungen: Primary key (id) CONSTRAINT INTEG_37: Unique key (Stelle, Art, Nummer1, Nummer2, Nummer3)

Triggers on Table Erlaeuterungen: Erlaeuterungen_Before, Sequence: 0, Type: BEFORE INSERT OR UPDATE, Active

Generated model

classpublic void Configure(EntityTypeBuilder builder) { builder.ToTable("Erlaeuterungen ");

        builder.HasIndex(e => e.Art)
            .HasName("IDXErlaeuterungen_Art")
            .IsUnique();

        builder.HasIndex(e => e.Id)
            .HasName("PK_Erlaeuterungen");

        builder.HasIndex(e => e.Stelle)
            .HasName("FK_Erlaeuterungen_Stelle")
            .IsUnique();

        builder.HasIndex(e => e.Txt1)
            .HasName("FK_Erlaeuterungen_TexteEbene1")
            .IsUnique();

        builder.HasIndex(e => e.Txt2)
            .HasName("FK_Erlaeuterungen_TexteEbene2")
            .IsUnique();

        builder.HasIndex(e => e.Txt3)
            .HasName("FK_Erlaeuterungen_TexteEbene3")
            .IsUnique();

        builder.HasIndex(e => new { e.Art, e.Nummer1, e.Nummer2, e.Nummer3, e.Stelle })
            .HasName("RDB$19");

        builder.Property(e => e.Id).HasColumnName("id");

        builder.Property(e => e.AnzahlInit)
            .HasColumnName("Anzahl_Init")
            .HasColumnType("DECIMAL(10, 2)")
            .HasDefaultValueSql("default 0");

        builder.Property(e => e.Ersatzplanstelle).HasColumnType("CHAR(1) CHARACTER SET UTF8");

        builder.Property(e => e.Wegfall).HasColumnType("DATE");
    }:

Model information:

public partial class Erlaeuterungen { public int Id { get; set; } public int? Stelle { get; set; } public short? Art { get; set; } public short? Nummer1 { get; set; } public short? Nummer2 { get; set; } public short? Nummer3 { get; set; } public int? Txt1 { get; set; } public int? Txt2 { get; set; } public int? Txt3 { get; set; } public decimal? AnzahlInit { get; set; } public DateTime? Wegfall { get; set; } public string Ersatzplanstelle { get; set; } public short Status { get; set; } }

Error details

See for example properties Stelle and Art, which are marked as optional within the model. See index RDB$19 which is not marked as unique.

Further technical details

Firebird version: ISQL Version: WI-V3.0.3.32900 Firebird 3.0

Other details about my project setup: