Delete record from link using Entity Framework

3

Good morning. I'm working with Entity Framework and I'm having trouble updating a relational table. For example, I have a product with several categories, in the edition I unlink the category x of the product. The update does not delete the unrelated product from the relational table, today I have to delete everything from the relation to re-register. Is there an automatic solution for the Entity update method already performing this relational deletion when the category is unlinked?

    
asked by anonymous 25.06.2015 / 15:06

3 answers

1

You can use .WillCascadeOnDelete (); In its context

Example:

//Auto-relacionamento Projeto
   modelBuilder.Entity<Usuario>()
   .HasOptional(p => p.ObjPai)
   .WithMany(p => p.ListaPartes)
   .HasForeignKey(p => p.ObjPaiID)
   .WillCascadeOnDelete(true);
    
07.07.2016 / 14:41
0

Hello,

You can enable the "EF" cascading deletion.

Entity Framework self-relationship enable cascading delete

But I particularly do not think it's a good idea given that you can add a table as a child and delete the record by mistake. Usually when I go through these problems I prefer to call the Exclusion method of all the child entities before deleting the parent. Logically everything within a transition "Begin tran".

    
25.06.2015 / 17:08
0

I did a test here and did not report your problem. In any case I'll describe what I did, it might help.

I have created the following tables:

CREATE TABLE [dbo].[Categoria](
    [CategoriaID] [int] IDENTITY(1,1) NOT NULL,
    [Descricao] [varchar](50) NOT NULL,
 CONSTRAINT [PK_Categoria] PRIMARY KEY CLUSTERED 
(
    [CategoriaID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Produto](
    [ProdutoID] [int] IDENTITY(1,1) NOT NULL,
    [Descricao] [varchar](50) NOT NULL,
 CONSTRAINT [PK_Produto] PRIMARY KEY CLUSTERED 
(
    [ProdutoID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[ProdutoCategoriaLink](
    [ProdutoID] [int] NOT NULL,
    [CategoriaID] [int] NOT NULL,
 CONSTRAINT [PK_ProdutoCategoriaLink] PRIMARY KEY CLUSTERED 
(
    [ProdutoID] ASC,
    [CategoriaID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[ProdutoCategoriaLink]  WITH CHECK ADD  CONSTRAINT [FK_ProdutoCategoriaLink_Categoria] FOREIGN KEY([CategoriaID])
REFERENCES [dbo].[Categoria] ([CategoriaID])
GO
ALTER TABLE [dbo].[ProdutoCategoriaLink] CHECK CONSTRAINT [FK_ProdutoCategoriaLink_Categoria]
GO
ALTER TABLE [dbo].[ProdutoCategoriaLink]  WITH CHECK ADD  CONSTRAINT [FK_ProdutoCategoriaLink_Produto] FOREIGN KEY([ProdutoID])
REFERENCES [dbo].[Produto] ([ProdutoID])
GO
ALTER TABLE [dbo].[ProdutoCategoriaLink] CHECK CONSTRAINT [FK_ProdutoCategoriaLink_Produto]
GO

After entering some data, I have the following records, note that my ProdutoCategoriaLink has 12 records .

CategoriaID Descricao
----------- --------------------------------------------------
1           Categoria 03
2           Categoria 04
3           Categoria 01
4           Categoria 02

ProdutoID   Descricao
----------- --------------------------------------------------
1           Produto 01
2           Produto 02
3           Produto 03
4           Produto 04

ProdutoID   CategoriaID
----------- -----------
1           1
1           3
1           4
2           2
2           3
2           4
3           2
3           3
3           4
4           1
4           2
4           4

I configured my mapping as follows:

public partial class Contexto : DbContext
{
    public Contexto()
        : base("name=Contexto")
    {
    }

    public virtual DbSet<Categoria> Categorias { get; set; }
    public virtual DbSet<Produto> Produtos { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Categoria>()
            .Property(e => e.Descricao)
            .IsUnicode(false);

        modelBuilder.Entity<Categoria>()
            .HasMany(e => e.Produtos)
            .WithMany(e => e.Categorias)
            .Map(m => m.ToTable("ProdutoCategoriaLink").MapLeftKey("CategoriaID").MapRightKey("ProdutoID"));

        modelBuilder.Entity<Produto>()
            .Property(e => e.Descricao)
            .IsUnicode(false);
    }
}

[Table("Produto")]
public partial class Produto
{
    public Produto()
    {
        Categorias = new HashSet<Categoria>();
    }

    public int ProdutoID { get; set; }

    [Required]
    [StringLength(50)]
    public string Descricao { get; set; }

    public virtual ICollection<Categoria> Categorias { get; set; }
}

[Table("Categoria")]
public partial class Categoria
{
    public Categoria()
    {
        Produtos = new HashSet<Produto>();
    }

    public int CategoriaID { get; set; }

    [Required]
    [StringLength(50)]
    public string Descricao { get; set; }

    public virtual ICollection<Produto> Produtos { get; set; }
}

Finally I ran the following code to exclude a category from each product:

using (var contexto = new Contexto())
{
    var random = new Random(0);
    foreach (var produto in contexto.Produtos)
    {                    
        var skip = random.Next(3);
        var categoria = produto.Categorias.Skip(skip).First();
        produto.Categorias.Remove(categoria);
    }

    contexto.SaveChanges();
}

When doing a select on my ProdutoCategoriaLink , I get the following records, note that I now only have 8 records .

ProdutoID   CategoriaID
----------- -----------
1           1
1           3
2           2
2           3
3           2
3           3
4           1
4           4
    
06.04.2016 / 14:16