Ich habe ein Muster gefunden, das meiner Meinung nach am besten funktioniert - zumindest in meinem Fall.
erweitere ich Entitätsklassen mit Teilklassen. Ich verwende Teilklassen, so dass sich die Signatur der Entität nicht ändert (siehe DeleteOnSubmit
Aufruf in der Delete
Methode).
Ich habe ein kleines Beispiel gekocht.Hier ist ein Bild von der Datenbank und LINQ to SQL-Klasse-Setup:
Und hier ist die Teil-Klasse, in der ich die Geschäftslogik implementieren:
/// <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 = "";
}
}
die implementierten Geschäftslogik verwenden:
// 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: ""
Außerdem: LINQ to SQL-Entity-Klassen sind sehr offen in der Natur. Dies bedeutet, dass die Eigenschaft, die der Spalte dbo.Products.ProductId entspricht, sowohl einen Getter als auch einen Setter implementiert - dieses Feld sollte nicht änderbar sein.
Meines Wissens nicht Eigenschaften mit partiellen Klassen außer Kraft setzen kann, so, was ich in der Regel tun, ist ein Manager implementieren, die das Objekt über eine Schnittstelle verengt:
public interface IProduct
{
Int32 ProductId { get; }
void Delete();
}
In Community-Wiki festgelegt. – roosteronacid