3
respostas

Relacionamento entre 3 tabelas

Em um relacionamento entre 3 tabelas, possuo as tabelas Cliente, Embarcação e Chamado.

Cada cliente tem sua embarcação, mas na tabela chamado, é possível que o cliente seja diferente do que está definido na embarcação.

Quando vou executar o Update-Database me retorna o seguinte erro: "Introducing FOREIGN KEY constraint 'FK_Chamado_Embarcacao_IDEMBARCACAO' on table 'Chamado' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints."

public class Cliente
{
        [Key]
        [Required]
        public int IDCLIENTE { get; set; }
}
public class Embarcacao
    {
        [Key]
        [Required]
        public int IDEMBARCACAO { get; set; }

        [Required]
        public int IDCLIENTE { get; set; }
        [ForeignKey("IDCLIENTE")]
        public virtual Cliente Cliente { get; set; }

public class Chamado
{
    [Key]
        [Required]
        public int IDCHAMADO { get; set; }

        [Required]
        public int IDCLIENTE { get; set; }
        [ForeignKey("IDCLIENTE")]
        public virtual Cliente Cliente { get; set; }

        [Required]
        public int IDEMBARCACAO { get; set; }
        [ForeignKey("IDEMBARCACAO")]
        public virtual Embarcacao Embarcacao { get; set; }
}
3 respostas

Fellipe, o Entity possui algumas ações em cascata, ou seja ele vai começar no objeto que vc mandou fazer e vai alterando todos os outros que estão relacionado a eles, sendo que muitas vezes (no meu ponto de vista é sempre) ele se perde nisso. Então la na classe Context tem o método OnModelCreating ( caso vc não tenha esse método vai ter que dar um override nele) e vai ter que adicionar as instruções:

/Desabilitamos o delete em cascata em relacionamentos 1:N evitando ter registros filhos sem registros pai/ builder.Conventions.Remove();

//Basicamente a mesma configuração, porém em relacionamenos N:N builder.Conventions.Remove();

vai ficar mais ou menos assim

protected override void OnModelCreating(DbModelBuilder builder) { /Desabilitamos o delete em cascata em relacionamentos 1:N evitando ter registros filhos sem registros pai/ builder.Conventions.Remove();

//Basicamente a mesma configuração, porém em relacionamenos N:N builder.Conventions.Remove(); }

Filipe, obrigado pela resposta,

Mexendo no código consegui rodar o Update-Database, mas fiz diferente. No código da Migration que foi gerada, exclui a linha de código

onDelete: ReferentialAction.Cascade

Sabe me dizer se é uma boa prática ? O resultado é o mesmo que re-escrever o código onModelCreating ?

Fellipe se não é uma boa pratica eu não sei... O que vc pode fazer é o seguinte gera uma nova Migration, e verifica se veio com essa linha. Se tiver vindo toda vez vc vai ter que tirar essa linha. Oque eu vejo muito gente fazer é da um override no método OnModelCreating

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software