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

Desabilitar o Delete em cascata

Tenho duas classes:

public class CaixaModel
    {
        public CaixaModel()
        {
            Movimentos = new List<CaixaMovimentoModel>();
        }

        [Key]
        public int CodigoId { get; set; }

        [Required, StringLength(30), Column("Nome do caixa")]
        public string Nome { get; set; }

        public int UsuarioId { get; set; }
        [Column("Responsável")]
        public UsuarioModel Responsavel { get; set; }

        public virtual ICollection<CaixaMovimentoModel> Movimentos { get; set; }
    }

e

public class UsuarioModel
    {
        [Key]
        public int UsuarioId { get; set; }

        [Required, StringLength(30)]
        public string Nome { get; set; }

        public virtual ICollection<PoderUsuarioModel> Poderes { get; set; }
    }

faço o update-database e aparece o seguinte erro:

Introducing FOREIGN KEY constraint 'FK_dbo.CaixaModels_dbo.UsuarioModels_UsuarioId' on table 'CaixaModels' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint.

Então fui no documento da Migration e modifiquei a menção do cascadeDelete para false:

CreateTable(
                "dbo.UsuarioModels",
                c => new
                    {
                        UsuarioId = c.Int(nullable: false, identity: true),
                        Nome = c.String(nullable: false, maxLength: 30),
                        Matricula = c.String(nullable: false, maxLength: 10),
                        Email = c.String(nullable: false),
                        Categoria = c.Int(nullable: false),
                        NºnaOAB = c.String(name: "Nº na OAB", maxLength: 10),
                        UFdaOAB = c.Int(name: "UF da OAB", nullable: false),
                        Ativo = c.Boolean(nullable: false),
                        PrazoModel_AndamentoId = c.Int(),
                        ProcessoModel_ProcessoId = c.Int(),
                    })
                .PrimaryKey(t => t.UsuarioId)
                .ForeignKey("dbo.CategoriaUsuarioModels", t => t.Categoria, cascadeDelete: false)
                .ForeignKey("dbo.AndamentoModels", t => t.PrazoModel_AndamentoId)
                .ForeignKey("dbo.ProcessoModels", t => t.ProcessoModel_ProcessoId)
                .Index(t => t.Categoria)
                .Index(t => t.PrazoModel_AndamentoId)
                .Index(t => t.ProcessoModel_ProcessoId);

O erro desapareceu!!!!

Mas quando faço outras modificações em modelos e uso o add-Migration Initial -Force, esse cascadeDelete é colocado como true novamente.

Então suponho que eu deveria colocar algo no Model indicando esse cascadeDelete como falso para que a reconstrução da Migration mantivesse esse valor.

Alguém tem uma ideia de onde fazer isso?

3 respostas

Olá, Jaqueline!

Experimente sobrescrever a configuração default do cascade delete, adicionando este override na classe Context:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}

Boa sorte e boas aulas!

Obrigado pela ajuda, mas você poderia me dizer onde encontro configuração default do cascade delete, ou onde esse override que você comentou?

solução!

Ah, me esqueci, você pode colocar esse código na classe EstoqueContext em \DAO\EstoqueContext.cs.