Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Permitir valores Nulos

Bom dia,

Como consigo permitir que seja inserido valores NULL nas colunas, estou exportando o json do ad-user e existe alguns campos nulos.

Erro:

Microsoft.EntityFrameworkCore.DbUpdateException
  HResult=0x80131500
  Message=An error occurred while updating the entries. See the inner exception for details.
  Source=Microsoft.EntityFrameworkCore.Relational
  StackTrace:
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _, ValueTuple`2 parameters)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IReadOnlyList`1 entries)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
   at MizuAgenda_Core.Repositories.ContatoRepository.SaveContatos(List`1 dadoscontatos) in C:\Users\thiagogriao\source\repos\MizuAgenda_Core_Novo\MizuAgenda_Core\Repositories\ContatoRepository.cs:line 43
   at MizuAgenda_Core.DataService.InicializaDB() in C:\Users\thiagogriao\source\repos\MizuAgenda_Core_Novo\MizuAgenda_Core\DataService.cs:line 28
   at MizuAgenda_Core.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider) in C:\Users\thiagogriao\source\repos\MizuAgenda_Core_Novo\MizuAgenda_Core\Startup.cs:line 74

Exceção interna 1:
SqlException: Não é possível inserir o valor NULL na coluna 'Ramal', tabela 'AGENDA.dbo.Contato'; a coluna não permite nulos. Falha em INSERT.
A instrução foi finalizada.
4 respostas

Thiago, boa tarde.

Parece que sua tabela de contatos possui uma coluna chamada Ramal que não permite valores nulos. Para mudar isso (ou seja permitir que um valor nulo seja inserido na coluna Ramal), você precisará criar uma migration configurando a nulidade.

Coloca aqui por favor seu código da classe de contato, além da classe de contexto do EF.

No aguardo do seu feedback.

Boa tarde, tentei alterar os valores de nuable e tirar os os IsRequired()e [Required], mas não funcionou, o ideal na minha situação seria nenhuma coluna obrigatória.

20180920123646_Inicial

namespace MizuAgenda_Core.Migrations
{
    public partial class Inicial : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Contato",
                columns: table => new
                {
                    Id = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    Nome = table.Column<string>(nullable: false),
                    Unidade = table.Column<string>(nullable: false),
                    Departamento = table.Column<string>(nullable: false),
                    Telefone = table.Column<string>(nullable: false),
                    Ramal = table.Column<string>(nullable: false),
                    Email = table.Column<string>(nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Contato", x => x.Id);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Contato");
        }
    }
}

ApplicationContextModelSnapshot

namespace MizuAgenda_Core.Migrations
{
    [DbContext(typeof(ApplicationContext))]
    partial class ApplicationContextModelSnapshot : ModelSnapshot
    {
        protected override void BuildModel(ModelBuilder modelBuilder)
        {
#pragma warning disable 612, 618
            modelBuilder
                .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
                .HasAnnotation("Relational:MaxIdentifierLength", 128)
                .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

            modelBuilder.Entity("MizuAgenda_Core.Models.AgendaModel+Contato", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

                    b.Property<string>("Departamento")
                        .IsRequired();

                    b.Property<string>("Email")
                        .IsRequired();

                    b.Property<string>("Nome")
                        .IsRequired();

                    b.Property<string>("Ramal")
                        .IsRequired();

                    b.Property<string>("Telefone")
                        .IsRequired();

                    b.Property<string>("Unidade")
                        .IsRequired();

                    b.HasKey("Id");

                    b.ToTable("Contato");
                });
#pragma warning restore 612, 618
        }
    }
}

AgendaModel

namespace MizuAgenda_Core.Models
{
    public class AgendaModel
    {
        public class BaseModel
        {
            [DataMember]
            public int Id { get; protected set; }
        }
        public class Contato : BaseModel
        {
            public Contato()
            {

            }

            [Required]
            public string Nome { get; private set; }
            [Required]
            public string Unidade { get; private set; }
            [Required]
            public string Departamento { get; private set; }
            [Required]
            public string Telefone { get; private set; }
            [Required]
            public string Ramal { get; private set; }
            [Required]
            public string Email { get; private set; }

            public Contato(string name, string office, string department, string telephonenumber, string fax, string mail)
            {
                this.Nome = name;
                this.Unidade = office;
                this.Departamento = department;
                this.Telefone = telephonenumber;
                this.Ramal = fax;
                this.Email = mail;
            }
        }
    }
}

Thiago, essa modificação não é feita na classe de snapshot (essa que herda de ModelSnapshot. Essa classe é atualizada automaticamente pelo EF assim que você criar nova migração.

Faça o seguinte:

  1. Remova o atributo [Required] da propriedade Ramal (e de todas as propriedades que desejar serem nulas - menos o Id) na classe de contato.
  2. Crie uma nova migração usando o comando Add-Migration RamalNullable.
  3. Confirme que a classe RamalNullable (que representa a migração) de fato configurou nullable: true através do código Ramal = table.Column<string>(),.
  4. Se o passo 3 foi validado, execute o comando Update-Database.

Teste novamente sua aplicação com o ramal nulo.

Por favor, me dê um feedback.

solução!

Daniel, funcionou perfeitamente!

Somente o retorno da classe RamalNullable que foi diferente com o códigomigrationBuilder.AlterColumn<string>( name: "Ramal", table: "Contato", nullable: false, oldClrType: typeof(string), oldNullable: true);, mas funcionou perfeitamente.

Obrigado pelo apoio!