2008-09-17 12 views
7

Ich bekomme das Konzept der Erstellung eines Geschäftsobjekts oder einer Entität, um etwas wie eine Person darzustellen. Ich kann dann die Person mit einem DTO serialisieren und an den Client senden. Wenn der Client das Objekt ändert, kann es ein IsDirty-Flag dort haben, wenn es zurück an den Server geschickt wird, weiß ich, um es zu aktualisieren.Wie können Änderungen an Geschäftsobjekten verfolgt werden?

Aber was ist, wenn ich ein Order-Objekt habe? Dies hat die Haupt-Kopfinformation, den Kunden, den Lieferanten, das erforderliche Datum usw. Dann hat es OrderItems, was eine List < OrderItem> ist, die die zu bestellenden Artikel sind. Ich möchte dieses Geschäftsobjekt auf meiner Benutzeroberfläche verwenden können. Also habe ich ein paar Textboxen an den Ort, Lieferant, benötigtes Datum usw. angeschlossen und ein Raster an OrderItems angeschlossen. Da OrderItems eine Liste ist, kann ich problemlos Datensätze hinzufügen und löschen. Aber wie verfolge ich das, besonders die gelöschten Objekte. Ich möchte nicht, dass die gelöschten Objekte in meinem Raster sichtbar sind, und ich sollte nicht in der Lage sein, über sie zu iterieren, wenn ich foreach verwende, weil sie gelöscht wurden. Aber ich muss immer noch die Tatsache verfolgen, dass es eine Löschung gab. Wie verfolge ich die Änderungen? Ich denke, ich brauche eine Arbeitseinheit? Aber dann scheint der Code ziemlich komplex zu werden. Also dann frage ich mich, warum nicht einfach DataTables verwenden und die Änderungsverfolgung kostenlos bekommen? Aber dann lese ich, wie Business-Objekte der richtige Weg sind.

Ich habe verschiedene Beispiele für einfache Person-Beispiele gefunden, nicht für Header-Detail-Beispiele wie Bestellungen.

BTW mit C# 3.5 für diese.

Antwort

-1

Die Datenobjekte verfolgen keine Änderungen. Die Änderungsverfolgung findet im DataContext und in Objekten statt, die Sie über den DataContext abgerufen haben. Also, um Änderungen zu verfolgen müssen Sie folgendes tun:

public class FooDataContext : DataContext 
{ 
    public Table<Order> Orders; 
} 

public class Order 
{ 
     [DbColumn(Identity = true)] 
     [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] 
     public int Id { get; set; } 

     [DbColumn(Default = "(getutcdate())")] 
     [Column(DbType = "DateTime", CanBeNull = false, IsDbGenerated = true)] 
     public DateTime DateCreated { get; set; } 

     [Column(DbType = "varchar(50)", CanBeNull = false, IsDbGenerated = false)] 
     public string Name { get; set; } 
} 

Jetzt in Ihrem Code-Behind Sie so etwas wie zu tun:

public void UpdateOrder(int id, string name) 
{ 
    FooDataContext db = new FooDataContext(); 
    Order order = db.Orders.Where(o=>o.Id == id).FirstOrDefault(); 

    if (order == null) return; 

    order.Name = name; 

    db.SubmitChanges(); 
} 

ich nicht direkt auf den Datenkontext in dem Code empfehlen würde hinter, aber das ist ein guter Weg, um mit Linq To SQL zu beginnen. Ich würde empfehlen, alle Ihre Datenbank-Interaktionen in ein externes Projekt zu setzen und von der GUI aus die Klassen aufzurufen, die dieses Verhalten einkapseln.

Ich würde empfehlen, eine Linq To Sql (dbml) -Datei zu erstellen, wenn Sie neu bei Linq To Sql sind.

Klicken Sie mit der rechten Maustaste auf Ihr Projekt im Lösungsexplorer und wählen Sie Neues Element hinzufügen. Wählen Sie Linq To SQL-Datei, und Sie können dann eine Verbindung zu Ihrer Datenbank herstellen und die Tabellen auswählen.

Sie können dann den generierten Code betrachten und einige gute Ideen bekommen, wie Linq To Sql funktioniert und was Sie damit machen können.

Verwendung als Richtlinie, die mit Linq to SQL auf die Arbeit und das wird Sie weit bringen ...

+0

Weg aus dem Thema !! –

6

Zum einen können Sie einen vorhandenen Rahmen verwenden, der diese Fragen behandelt werden, wie CSLA.NET. Der Autor dieses Rahmens hat genau diese Probleme angegangen. Gehen Sie dazu zu http://www.rockfordlhotka.net/cslanet/. Auch wenn Sie nicht das vollständige Framework verwenden, sind die Konzepte immer noch anwendbar.

Wenn Sie Ihre eigenen rollen wollten, habe ich in der Vergangenheit statt List für meine Sammlungen verwendet, einen benutzerdefinierten Typ verwendet, der von BindingList abgeleitet wurde. Wenn Sie BindingList verwenden, können Sie das Verhalten des Elements zum Hinzufügen/Entfernen überschreiben. So können Sie zum Beispiel eine andere interne Sammlung von "delteten" Elementen haben. Jedes Mal, wenn die überschriebene Methode Remove für Ihre Auflistung aufgerufen wird, legen Sie das Element in die Sammlung "deleted" und rufen Sie dann die Basisimplementierung der Remove-Methode auf. Sie können das Gleiche für hinzugefügte Elemente oder geänderte Elemente tun.

2

Sie sind gerade dabei, eine Arbeitseinheit zu benötigen, aber schreiben Sie keine. Verwenden Sie NHibernate oder ein anderes ORM. Dafür sind sie gemacht. Sie haben Unit of Works eingebaut.

Business-Objekte sind in der Tat "der Weg zu gehen" für die meisten Anwendungen. Du taucht in einen tiefen Bereich und es wird viel zu lernen geben. Schau in DDD.

Ich würde auch stark davon abraten Code wie in Ihrem Code-behind. Schau dir das MVP-Muster an.

Ich würde auch (während ich störe, viele neue, sehr kritische Dinge zu lernen) in SOLID schauen.

Sie möchten vielleicht JP Boodhoo nichts als .net natürlich überprüfen, wie es viele dieser Dinge abdeckt.

Verwandte Themen