2008-10-21 8 views

Antwort

3

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(); 
} 
1

Im Moment versuche ich LINQ to SQL Entity-Klassen als Business-Objekte zu verwenden, so dass sie zwischen den Funktionen und Dienstleistungen rund um passieren.

Natürlich sollten Sie separate Entitätsklassen für den Datenbankzugriff haben, damit sich Ihr Datenbanklayout ändern kann, ohne die Geschäftsobjekte zu ändern!

Ich wäre auch an einer guten Lösung dafür interessiert!

0

Ich experimentierte mit Entity Framework und Linq to Entities als eine Möglichkeit, meinen Client-Code weiter von der Datenbank zu trennen, aber ich fand es plump zu verwenden und war besorgt über die Leistung.

In meinem aktuellen Projekt verwende ich Linq als meine Datenschicht SQL, haben aber getrennte Klassen, in denen ich alle Linq-Abfragen implementieren. Die Klassen geben Entities zurück, die in meinem Linq-SQL-Kontext definiert sind, aber die Abfragen sind in Methoden verborgen.

1

überprüfen Sie den Quellcode für die MVC-Beispielanwendung aus, die Rob Conery setzt zusammen:

http://www.codeplex.com/mvcsamples/

Er hat eine separate Einheit Schicht, die auf SQL-Klassen in dem LINQ abbildet.

2

Ich neige dazu, das Repository-Muster verwenden Datacontexts zu verkapseln.

Repository Pattern

Ich möchte einen besseren Weg finden Schicht zu emittieren POCO Objekte aus meiner Daten während obwohl mit LINQ2SQL.

0

Ich fand die Artikel von Ian Cooper on CodeBetter.com und Stephen Walther Serie von unschätzbarem Wert für das Verständnis der Notwendigkeit, die POCO-Einheiten zuerst zu schreiben und sie dann auf die Datenbank abzubilden, anstatt es anders herum zu machen (was ich immer gemacht habe).

0

Ich spiele mit dem Gedanken, um eine separate Schicht von OO-Modell zu haben (eine bessere Unterstützung für OO Praktiken), aber, dass die Verwendung von LINQ unter der Haube SQL. Die Idee besteht darin, eine XML-Datei zu erstellen, die ein benutzerdefiniertes Tool zum Generieren des Codes verwendet. Da die LINQ to SQL-Berechtigungen für meine Einstellungen zu unübersichtlich sind, erzeuge ich automatisch neue Klassen, die als meine Entitäten verwendet werden, und natürlich wird der DataContext für den Client-Code vollständig ausgeblendet. Ist die kurze Antwort: Erstellen Sie neue Entitätsklassen, aber verwenden Sie die zugrunde liegenden LINQ to SQL-Entitäten und DataContext.