Delete Relate Record using Entity Framework

Asked

Viewed 1,833 times

3

Good morning. I am working with Entity Framework and I have a problem updating a relational table. For example, I have a product with several categories, in the edition I remove the category x of the product. The update does not exclude the unlinked product from the relational table, today I have to delete everything from the relaunch to re-subscribe. Is there any automatic solution for the Entity update method to already perform this relational exclusion when the category is unlinked?

  • Can you please put in your question how is the relationship between Product and Category?

  • Solved the problem?

3 answers

1

You can use the . 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);

0

Hello,

You can enable "EF cascading deletion".

Entity Framework auto relationship enable cascading delete

But I don’t particularly think it’s a good idea since you can add a table as a daughter and delete the record by mistake. Usually when I go through these problems I prefer to call the method Deletion of all daughter entities before deleting the father. Logically all within a transition "Begin Tran" .

0

I ran a test here and I didn’t report your problem. In any case I will describe what I did, it may help you.

I 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 kept the following records, note that my ProdutoCategoriaLink possesses 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 executed 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 making a select in mine ProdutoCategoriaLink, I obtained the following records, note that now I have only 8 records.

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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.