The first thing to do is to create the tables, in case you would have the tables Produto
, Pedido
and the relationship table PedidoProduto
.
CREATE TABLE dbo.Produtos (
ProdutoId uniqueidentifier NOT NULL rowguidcol default newsequentialid(),
Descricao varchar(50) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Produtos ADD CONSTRAINT PK_Produtos PRIMARY KEY CLUSTERED (ProdutoId) ON [PRIMARY]
GO
CREATE TABLE dbo.Pedidos (
PedidoId uniqueidentifier NOT NULL rowguidcol default newsequentialid(),
Descricao varchar(50) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Pedidos ADD CONSTRAINT PK_Pedidos PRIMARY KEY CLUSTERED (PedidoId) ON [PRIMARY]
GO
CREATE TABLE dbo.PedidoProdutos (
PedidoProdutoLinkId uniqueidentifier NOT NULL rowguidcol default newsequentialid(),
PedidoId uniqueidentifier NOT NULL,
ProdutoId uniqueidentifier NOT NULL,
Quantidade decimal(10, 2) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.PedidoProdutos ADD CONSTRAINT PK_PedidoProdutos PRIMARY KEY CLUSTERED (PedidoProdutoLinkId) ON [PRIMARY]
GO
At this time there is no relationship between tables, you need to create a relationship of 1:N
between Pedido
and PedidoProduto
and N:1
between PedidoProduto
and Produto
. In practice it will be a N:M
relationship between Produto
and Pedido
.
ALTER TABLE dbo.PedidoProdutos ADD CONSTRAINT FK_PedidoProdutos_Pedidos
FOREIGN KEY (PedidoId) REFERENCES dbo.Pedidos (PedidoId)
ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
ALTER TABLE dbo.PedidoProdutos ADD CONSTRAINT FK_PedidoProdutos_Produtos
FOREIGN KEY (ProdutoId) REFERENCES dbo.Produtos (ProdutoId)
ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
Of course, do not forget to create the indexes for the FK (although it is not mandatory).
CREATE NONCLUSTERED INDEX IX_PedidoProdutos_ProdutoId ON dbo.PedidoProdutos(ProdutoId) ON [PRIMARY]
GO
CREATE UNIQUE NONCLUSTERED INDEX IX_PedidoProdutos_PedidoId_ProdutoId ON dbo.PedidoProdutos(PedidoId, ProdutoId) on [PRIMARY]
GO
Now let's go to C #, so let's model the entities.:
public class Produto
{
public Guid ProdutoId { get; set; }
public string Descricao { get; set; }
public ICollection<PedidoProduto> Pedidos { get; set; }
}
public class Pedido
{
public Guid PedidoId { get; set; }
public string Descricao { get; set; }
public ICollection<PedidoProduto> Produtos { get; set; }
}
public class PedidoProduto
{
public Guid PedidoProdutoId { get; set; }
public Guid PedidoId { get; set; }
public Guid ProdutoId { get; set; }
public decimal Quantidade { get; set; }
public Pedido Pedido { get; set; }
public Produto Produto { get; set; }
}
If you are not using an ORM to enter the data, I suggest using Dapper
and Dapper.Contrib
: Install-Package Dapper
and Install-Package Dapper.Contrib
, and in this case in specific, since the Key is a Guid, use RT.Comb
: Install-Package RT.Comb
Here's an example to insert a Product:
var produto = new Produto
{
ProdutoId = RT.Comb.Provider.Sql.Create(),
Descricao = "Produto 01"
};
using (var conexao = new SqlConnection("%sua string de conexao%"))
{
conexao.Open();
conexao.Insert(produto);
}
Now let's go to Pedido
and their respective Produtos
var pedido = new Pedido
{
PedidoId = RT.Comb.Provider.Sql.Create(),
Descricao = "Pedido 01",
Produtos = new List<PedidoProduto>()
};
for (var i = 1, i <= 5, i++)
{
var produtoId = Guid.Parse("%id do produto aqui%");
var produto = new PedidoProduto
{
PedidoProdutoId = RT.Comb.Provider.Sql.Create(),
PedidoId = pedido.PedidoId,
ProdutoId = produtoId,
Quantidade = i
};
pedido.Produtos.Add(produto)
}
using (var conexao = new SqlConnection("%sua string de conexao%"))
{
conexao.Open();
using (var tras = conexao.BeginTransaction())
{
conexao.Insert(pedido);
foreach (var produto in pedido.Produtos)
{
conexao.Insert(produto);
}
tras.Commit();
}
}
And finally, if you wanted to make a query.:
var pedidoId = Guid.Parse("%id do pedido aqui%");
using (var conexao = new SqlConnection("%sua string de conexao%"))
{
conexao.Open();
var pedido = conexao.QueryFirstOrDefault<Pedido>("SELECT * FROM Pedidos WHERE PedidoId = @PedidoId", new { PedidoId = pedidoId });
pedido.Produtos = conexao.Query<PedidoProduto>("SELECT * FROM PedidoProdutos WHERE PedidoId = @PedidoId", new { PedidoId = pedidoId }).ToList();
}