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

Migration torna Required uma coluna que não é

Criei um model:

public class Tarefa
    {
        [Key]
        public int ID { get; set; }

        public int TipoTarefaID { get; set; }
        [Display(Name = "Tipo de tarefa")]
        public virtual TipoTarefa TipoTarefa { get; set; }

        public string Assunto { get; set; }

        [Required, Display(Name = "Data da criação")]
        public DateTime DataCriacao { get; set; }

        public int ClienteID { get; set;  }
        public virtual Cliente Cliente { get; set; }

        public int ProcessoID { get; set; }
        public virtual Processo Processo { get; set; }       
    }

Os atributos Cliente e Processo não são Obrigatórios durante o cadastro de uma nova tarefa.

Adiciono a Migration e faço o update-dabatase e olha o que aparece na estrutura da tabela, Cliente e Processo como NOT NULL

Por que isso acontece?

CREATE TABLE [dbo].[Tarefas] (
    [ID]                 INT            IDENTITY (1, 1) NOT NULL,
    [TipoTarefaID]       INT            NOT NULL,
    [Assunto]            NVARCHAR (MAX) NULL,
    [DataCriacao]        DATETIME       NOT NULL,
    [ClienteID]          INT            NOT NULL,
    [ProcessoID]         INT            NOT NULL,
    CONSTRAINT [FK_dbo.Tarefas_dbo.Clientes_ClienteID] FOREIGN KEY ([ClienteID]) REFERENCES [dbo].[Clientes] ([ID]) ON DELETE CASCADE,
    CONSTRAINT [FK_dbo.Tarefas_dbo.Processoes_Pasta (se ajuizado)] FOREIGN KEY ([ProcessoID]) REFERENCES [dbo].[Processoes] ([ID]) ON DELETE CASCADE,
    CONSTRAINT [FK_dbo.Tarefas_dbo.TipoTarefas_TipoTarefaID] FOREIGN KEY ([TipoTarefaID]) REFERENCES [dbo].[TipoTarefas] ([ID]) ON DELETE CASCADE
);


GO
CREATE NONCLUSTERED INDEX [IX_TipoTarefaID]
    ON [dbo].[Tarefas]([TipoTarefaID] ASC);


GO
CREATE NONCLUSTERED INDEX [IX_ClienteID]
    ON [dbo].[Tarefas]([ClienteID] ASC);


GO
CREATE NONCLUSTERED INDEX [IX_ProcessoID]
    ON [dbo].[Tarefas]([ProcessoID] ASC);
2 respostas

Vou dar meu chute e esperar que um especialista confirme ou negue :). int é como se fosse um tipo primitivo, não existe nulo para ele.. o valor de inicialização dele é zero. Acho que você deveria usar o Integer.

solução!

É exatamente este problema Alberto, o tipo primitivo int não aceita null, então o Entity Framework assume que sua Foreign key é not null.

No caso do C# não existe a classe Integer, para fazer com que o int aceite o valor null basta colocar como tipo um int?