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