4
I have the following example of a software that uses Entity Framework, accessing a database with only one table called Produtos
with the following fields:
- Field
int produtoid
. - Field
string nomeproduto
. - Field
int categoriaid
.
It also has a form where I perform the CRUD, see:
Here follows the code of the two files generated by EF which is mine Context and my class Produtos
.
Class Produtos
:
namespace CRUD_EF
{
using System;
using System.Collections.Generic;
public partial class Produtos
{
public int produtoid { get; set; }
public string nomeproduto { get; set; }
public int categoriaid { get; set; }
}
}
Class ExemploEFEntities
:
namespace CRUD_EF
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class ExemploEFEntities : DbContext
{
public ExemploEFEntities()
: base("name=ExemploEFEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Produtos> Produtos { get; set; }
}
}
And this is the entire code of my form (Form1.Cs):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CRUD_EF
{
public partial class frmPrincipal : Form
{
public frmPrincipal()
{
InitializeComponent();
}
private void frmPrincipal_Load(object sender, EventArgs e)
{
lerProdutos();
}
private void lerProdutos()
{
ExemploEFEntities context = new ExemploEFEntities();
IEnumerable<Produtos> produtos = from p
in context.Produtos
select p;
dataGridViewProdutos.DataSource = produtos.ToList();
}
private void incluir(string nomeProduto, int idCategoria)
{
ExemploEFEntities context = new ExemploEFEntities();
Produtos novoProduto = new Produtos()
{
nomeproduto = nomeProduto,
categoriaid = idCategoria
};
context.Produtos.Add(novoProduto);
context.SaveChanges();
lerProdutos();
}
private void btnIncluir_Click(object sender, EventArgs e)
{
incluir(txtNome.Text, Convert.ToInt32(txtCategoriaID.Text));
}
private void btnAlterar_Click(object sender, EventArgs e)
{
alterar();
}
private void alterar()
{
ExemploEFEntities context = new ExemploEFEntities();
int id = Convert.ToInt32(txtProdutoId.Text);
Produtos produto = context.Produtos.First(p => p.produtoid == id);
produto.nomeproduto = txtNome.Text;
produto.categoriaid = Convert.ToInt32(txtCategoriaID.Text);
context.SaveChanges();
lerProdutos();
}
private void deletar()
{
ExemploEFEntities context = new ExemploEFEntities();
int id = Convert.ToInt32(txtProdutoId.Text);
Produtos produto = context.Produtos.First(p => p.produtoid == id);
context.Produtos.Remove(produto);
context.SaveChanges();
lerProdutos();
}
private void btnExcluir_Click(object sender, EventArgs e)
{
deletar();
}
private void query(int id)
{
ExemploEFEntities context = new ExemploEFEntities();
Produtos produto = context.Produtos.First(p => p.produtoid == id);
txtProdutoId.Text = produto.produtoid.ToString();
txtNome.Text = produto.nomeproduto.ToString();
txtCategoriaID.Text = produto.categoriaid.ToString();
}
private void dataGridViewProdutos_CellEnter(object sender, DataGridViewCellEventArgs e)
{
try
{
int id = Convert.ToInt32(dataGridViewProdutos.Rows[e.RowIndex].Cells[0].Value);
query(id);
}
catch
{
MessageBox.Show("Houve um erro!");
}
}
}
}
My doubt.
Taking into account all the above structure generated by Entity Framework i would like to know how and where I could implement the business rules?
To facilitate and illustrate the situation we will consider the following rule:
Registering products with the exact same name is not allowed.
How and where I would implement this rule?
drmcarvalho, beware of declaring your context outside a block
using
, this will generate a waste of resources, so always do as in the @Smael examples.– Tobias Mesquita
As for adding restrictions, you don’t need to use
Repository Patterns
, just make use ofData Annotations
and/or rules inMapeamento
, things like record size, single sets of records, restructures (single value, range, larger than other field, etc.), relationships are easily configured usingDataAnnotations
or in the Mapping.– Tobias Mesquita
Yes, how could I use the Annotations? You could publish a reply?
– gato