Frage

Ich möchte eine von linq generierte Klasse auf SQL erweitern, um zu initialisieren, wenn ein neues Objekt (= Zeile) erstellt wird.

Ich möchte einer untergeordneten Tabelle Zeilen hinzufügen, wenn eine übergeordnete Zeile erstellt wird.

Ich hatte gehofft, die On -Created (teilweise) Methode zu verwenden, um so etwas zu tun:

partial class Product {
    partial void OnCreated() {
        // Fill default rows for FK relations
        this.Columns.Add(new ProductColumn {
            Name = "Name", ColumnType = 1
        });
        this.Columns.Add(new ProductColumn {
            Name = "Producer", ColumnType = 2
        });
    }
}

Das On -Erstellte wird jedes Mal vom Konstruktor aufgerufen. So auch wenn das Objekt nach dem Aufruf auf die Einstellung aus der Datenbank geladen wird. Und wenn das Objekt aus der Datenbank geladen wird, möchte der Code nicht ausführen.

Wo kann ich meinem Modell Logik hinzufügen, um ein Objekt (-Graph) zu initialisieren?

War es hilfreich?

Lösung

Ich denke, Sie sollten in dieser Instanz besser dran sind, um eine Fabrik zu verwenden, um Ihre Instanzen zu erstellen. Also überall, wo Sie aktuell Code haben wie:

Product p = new Product();

Sie hätten stattdessen:

Product p = ProductFactory.CreateProduct();

Und Ihre Methode für das CreateProduct () würde aussehen wie:

public Product CreateProduct()
{
    var p = new Product();
    p.Columns.Add(new ProductColumn {
        Name = "Name", ColumnType = 1
    });
    p.Columns.Add(new ProductColumn {
        Name = "Producer", ColumnType = 2
    });
    return p;
}

Andere Tipps

Es gibt keine eingebaute Methode dafür im linq zu sql generierten Klassen. Sie rufen speziell auf, wenn sie aus der DB aufgerufen werden, aber sie rufen nichts an, wenn dies nicht der Fall ist. Ich vermute, weil es keine Möglichkeit gibt, sicher zu wissen ...

Ich würde empfehlen, den von Chris vorgeschlagenen Werksansatz zu verwenden.

Mit Linq-to-SQL sind die Entitäten weitgehend Nicht bewusst des übergeordneten Datenkontextes-nur faul beladene Mitglieder wie EntitySet<T> Bescheid über dieses Detail. Sie können Datenkontext-Begründungen identifizieren, indem Sie sich ansehen .IsDeferred (Angenommen ist Aufgeschoben) - Dies gilt, wenn ein Datenkontext beteiligt ist, und ansonsten falsch - aber es gibt weitere Probleme:

  • LINQ-to-SQL fügt den Datenkontext an (für die aufgeschobene Ausführung) nach das Konstruktur (und OnCreated) hat ausgeführt
  • Wenn Sie Gegenstände manuell in addieren OnCreated/.ctor(), Es bricht, wenn Linq-to-SQL versucht, den Datenkontext anzuhängen
  • LINQ-to-SQL verwendet den Standardkonstruktor, was bedeutet, dass Generika/new() usw. wird diesen Code auch weitergeben

So leider; Nein, ich glaube nicht, dass Sie das tun können OnCreated in jeder vernünftigen Weise. Sie könnten:

  • Haben Sie einen zweiten Konstruktor für diese Verwendung, die die zusätzlichen Elemente hinzufügt
  • Verwenden Sie eine Fabrikmethode, dh eine statische .Create() Methode, die Elemente korrekt erstellt

(Da Linq-to-SQL kein der oben genannten Verwendung verwendet)

Wenn Sie den Designer verwenden - und ich nehme an, Sie sind, weil Sie Teilklassen verwenden -, können Sie den Assoziation im Designer hinzufügen und die entsprechenden Spalten werden Ihrem Objekt automatisch hinzugefügt. MSDN hat eine Referenz auf So erstellen Sie Assoziationen Verwenden der Designer -Arbeitsfläche.

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