andrebaltieri / Flunt

Validations and Notifications
https://github.com/andrebaltieri/flunt
MIT License
624 stars 162 forks source link

Campo TempId gerado ao realizar migration com EFCore + Notifiable<Notification> #98

Closed rodrigo-zanfa closed 2 years ago

rodrigo-zanfa commented 2 years ago

Nas versões >= 2.0 do Flunt, sempre que uma entidade herda de Notifiable<Notification>, ao criar um migration, é inserido um campo adicional TempId em todas as tabelas; exemplo:

    public class Usuario : Notifiable<Notification>
    {
        public Usuario(int idUsuario, string nome)
        {
            IdUsuario = idUsuario;
            Nome = nome;
        }

        public int IdUsuario { get; private set; }
        public string Nome { get; private set; }
    }

Método da classe de migration:

        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "APIUsuario",
                columns: table => new
                {
                    IdUsuario = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Nome = table.Column<string>(type: "varchar(100)", maxLength: 100, nullable: false),
                    TempId = table.Column<int>(type: "int", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_APIUsuario", x => x.IdUsuario);
                    table.UniqueConstraint("AK_APIUsuario_TempId", x => x.TempId);
                });
        }

Script gerado:

IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
    CREATE TABLE [__EFMigrationsHistory] (
        [MigrationId] nvarchar(150) NOT NULL,
        [ProductVersion] nvarchar(32) NOT NULL,
        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
    );
END;
GO

BEGIN TRANSACTION;
GO

CREATE TABLE [APIUsuario] (
    [IdUsuario] int NOT NULL IDENTITY,
    [Nome] varchar(100) NOT NULL,
    [TempId] int NOT NULL,
    CONSTRAINT [PK_APIUsuario] PRIMARY KEY ([IdUsuario]),
    CONSTRAINT [AK_APIUsuario_TempId] UNIQUE ([TempId])
);
GO

INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20211218040502_nomedamigracao', N'5.0.13');
GO

COMMIT;
GO

Já tentei removê-lo, mas sem sucesso.

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Ignore<Notification>();
            modelBuilder.Ignore<Notifiable<Notification>>();

            modelBuilder.ApplyConfiguration(new UsuarioMap());
        }
andrebaltieri commented 2 years ago

Bom dia @rodrigo-zanfa, você pode usar o NotMapped para indicar que uma propriedade não deve ser mapeada em uma classe. Chegou a testar este?

rodrigo-zanfa commented 2 years ago

Mas como eu vou anotar um property com NotMapped se ele nem existe na minha classe?? O que eu disse é que não faço ideia de como este TempId apareceu na minha tabela no momento que eu gerei o migration. E ele só aparece quando minha classe herda de Notifiable<Notification>; se ela não herdar, esse TempId não é criado (ou seja, fica correto!).

andrebaltieri commented 2 years ago

Mas como eu vou anotar um property com NotMapped se ele nem existe na minha classe?? O que eu disse é que não faço ideia de como este TempId apareceu na minha tabela no momento que eu gerei o migration. E ele só aparece quando minha classe herda de Notifiable<Notification>; se ela não herdar, esse TempId não é criado (ou seja, fica correto!).

Você pode criar sua própria notificação e depois usar ela na sua classe:

public class MinhaClasse : Notifiable<MinhaNotificacaoComNotMapped> ...