The first thing to do, is 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 the tables, you need to create a relationship of 1:N
amid Pedido
and PedidoProduto
and N:1
amid PedidoProduto
and Produto
. In practice it will be a relationship of N:M
amid 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
And of course, don’t forget to create the indexes for FK (although it’s 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#, then 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 a ORM to enter the data, I advise you to use the Dapper
and Dapper.Contrib
: Install-Package Dapper
and Install-Package Dapper.Contrib
, and in this case specifically, since the Key is a Guid, use the RT.Comb
: Install-Package RT.Comb
below is 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, in case I wanted to perform a consultation.:
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();
}
You can add your products to a
DataGridView
orListView
, then through theRows
collect data for storage.– Paulo Ricardo