Frage

Was sind Ihre Lieblings-Möglichkeiten, LINQ to SQL Entity-Klassen und Daten-Kontextklassen in Business-Objekte kapseln?

Was haben Sie in einer bestimmten Situation arbeiten gefunden?

Haben Sie erfunden oder auf irgendwelche spezifischen Muster genommen?

War es hilfreich?

Lösung

Ich habe ein Muster gefunden, die ich denke, am besten funktioniert - In meinem Fall zumindest.
Ich erweitere Entitätsklassen mit Teilklassen. Ich benutze partielle Klassen, so dass die Unterschrift des Unternehmens nicht ändert (den DeleteOnSubmit Aufruf im Delete Methode sehen).

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 = "";
    }
}

Mit der implementierten Geschäftslogik:

// 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 die dbo.Products.ProductId Spalte implementiert sowohl ein Getter und Setter ein -. Dieses Feld sollte nicht veränderbar sein

Nach meinem Wissen Sie 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();
}

Andere Tipps

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

Repository Pattern

Ich mag einen besseren Weg finden Schicht zu emittieren POCO Objekten aus meinen Daten während obwohl mit LINQ2SQL.

Ich veröffentliche nur ein Beispiel dafür, wie Sie Ihre Anwendung strukturieren können, die Linq verwendet für die Lagerung SQL-, mit IoC und T4-Vorlagen.

http://daniel.wertheim.se/2010/03/14/linq-to-sql-how-to-separate-the-entities-and-the-datacontext/

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

Natürlich sollten Sie separate Einheit Klassen für den Datenbankzugriff haben , so dass Ihr Datenbank-Layout ohne Änderung der Geschäftsobjekte ändern kann!

Es würde mich am meisten interessiert eine gute Lösung für diese, auch!

Ü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.

habe ich einige Experimente unter Verwendung von Entity Framework und Linq to Entities als eine Möglichkeit, meine Client-Code aus der Datenbank weiter zu trennen, aber ich fand es ungeschickt zu bedienen und machte sich Sorgen ü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 zurückkehren Entitäten definiert in meine Linq to SQL-Kontext, aber die Abfragen werden in Methoden versteckt.

fand ich die Artikel von Ian Cooper auf CodeBetter.com und Stephen Walther Serie von unschätzbarem Wert die Notwendigkeit, das Verständnis der POCO Einheiten zuerst zu schreiben und sie dann in der Datenbank abzubilden, anstatt es in die andere Richtung zu tun um (das ist, was ich immer zu tun pflegte).

Ich spiele um mit der Idee, eine separate Schicht von OO-Modell (eine bessere Unterstützung für OO Praktiken) zu haben, aber diese Verwendung LINQ unter der Haube SQL. Die Idee ist, eine XML-Datei zu haben, die ein benutzerdefiniertes Tool zu erzeugen, um den Code verwenden. Da LINQ to SQL entites für meine Vorlieben zu überladen sind, werde ich automatisch generieren neue Klassen wie meine Einheiten zu verwenden, und natürlich wird die Datacontext vollständig für den Client-Code ausgeblendet werden. Haben die kurze Antwort ist:. Erstellen Sie neue Entitätsklassen aber verwenden, um die zugrunde liegende LINQ to SQL Entitäten und Datacontext

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top