He encontrado un patrón que creo que funciona mejor - En mi caso, al menos.
Extiendo clases de entidades usando clases parciales. Utilizo clases parciales para que la firma de la entidad no cambie (consulte la llamada DeleteOnSubmit
en el método Delete
).
He preparado un pequeño ejemplo.Aquí está una imagen de la base de datos y LINQ para configurar la clase de SQL:
Y aquí está la clase parcial en el que pongo en práctica la lógica de negocio:
/// <summary>
/// This class extends BusinessLogicDataContext.Products entity class
/// </summary>
public partial class Product
{
/// <summary>
/// New up a product by column: dbo.Products.ProductId in database
/// </summary>
public Product(Int32 id)
{
var dc = new BusinessLogicDataContext();
// query database for the product
var query = (
from p in dc.Products
where p.ProductId == id
select p
).FirstOrDefault();
// if database-entry does not exist in database, exit
if (query == null) return;
/* if product exists, populate self (this._ProductId and
this._ProductName are both auto-generated private
variables of the entity class which corresponds to the
auto-generated public properties: ProductId and ProductName) */
this._ProductId = query.ProductId;
this._ProductName = query.ProductName;
}
/// <summary>
/// Delete product
/// </summary>
public void Delete()
{
// if self is not poulated, exit
if (this._ProductId == 0) return;
var dc = new BusinessLogicDataContext();
// delete entry in database
dc.Products.DeleteOnSubmit(this);
dc.SubmitChanges();
// reset self (you could implement IDisposable here)
this._ProductId = 0;
this._ProductName = "";
}
}
Usando la lógica de negocio en marcha:
// new up a product
var p = new Product(1); // p.ProductId: 1, p.ProductName: "A car"
// delete the product
p.Delete(); // p.ProductId: 0, p.ProductName: ""
Además: las clases de entidad LINQ a SQL son de naturaleza muy abierta. Esto significa que la propiedad correspondiente a la columna dbo.Products.ProductId implementa tanto un getter como un setter; este campo no debe ser modificable.
Que yo sepa, no se puede anular el inmueble con las clases parciales, por lo que lo que suelo hacer es implementar un administrador que se estrecha el objeto con una interfaz:
public interface IProduct
{
Int32 ProductId { get; }
void Delete();
}
Establecer en la comunidad wiki. – roosteronacid