andrebaltieri / Flunt

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

The entity type 'Notification' requires a primary key to be defined. #23

Closed willianas1 closed 5 years ago

willianas1 commented 6 years ago

Ao tentar usar o Flunt com o EF Core sempre apresenta essas mensagem ao fazer um add-migration.

Já defini a Key da entidade no DBContext, porem quando coloco a entidade para herdar de Notifiable, o EF reclama da primary key.

Alguém poderia ajudar? :)

renebentes commented 6 years ago

Adiciona esse código no seu contexto

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Ignore<Notification>();
}
andrebaltieri commented 5 years ago

Closing

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:

        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);
                });
        }

Já tentei removê-lo, mas sem sucesso. Sugestões?

rrispoli 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:

        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);
                });
        }

Já tentei removê-lo, mas sem sucesso. Sugestões?

Passei por esse problema com versão 2.0.5 do Flunt e consegui resolver fazendo o seguinte na minha classe ApplicationDbContext:

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

    modelBuilder.Owned<Cpf>();
    modelBuilder.Owned<Name>();
    modelBuilder.Owned<Email>();
    modelBuilder.Owned<Phone>();

    modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);
}

E depois em um arquivo de configuração da classe que possui as propriedades valueobjects fiz isso:

public class SellerConfiguration : IEntityTypeConfiguration<Seller>
{
    public void Configure(EntityTypeBuilder<Seller> builder)
    {
        builder.OwnsOne(x => x.Cpf)
            .Property(x => x.Number)
            .IsRequired();

        builder.OwnsOne(x => x.Cpf)
            .Ignore(x => x.Notifications);

        builder.OwnsOne(x => x.Name)
            .Property(x => x.FirstName)
            .IsRequired();

        builder.OwnsOne(x => x.Name)
            .Property(x => x.LastName)
            .IsRequired();

        builder.OwnsOne(x => x.Name)
            .Ignore(x => x.Notifications);

        builder.OwnsOne(x => x.Email)
            .Property(x => x.Address)
            .IsRequired();

        builder.OwnsOne(x => x.Email)
            .Ignore(x => x.Notifications);

        builder.OwnsOne(x => x.Phone)
            .Property(x => x.Number)
            .IsRequired();

        builder.OwnsOne(x => x.Phone)
            .Ignore(x => x.Notifications);
    }
}