Frage

Ich habe gebaut ein schönes repository-Ebene um eine db4o-Datenbank zur Speicherung von Product Objekte, die sich Manufacturer Objekte in einer eins-zu-viele-Beziehung, d.h.:

public class Manufacturer
{
    public string Name { get; set; }
}

public class Product // simplified
{
    public string Name { get; set; }
    Manufacturer Manufacturer { get; set; }
}

So weit ich wirklich wie db4o.Das problem, das ich habe, ist, verhindert die Duplizierung von Daten, ohne auf die IDs.

Bei der Durchführung Hinweise, wie der Hersteller mithilfe von SQL Server, eigene Daten-Modelle enthalten würde ein eindeutiges ID-Feld, und im Gegenzug meine Product Klasse wäre es beschmutzt mit einem ManufacturerID.Ich habe gedacht, mit einem Objekt wie bei einer Datenbank db4o würde, reduzieren die Impedanz mismatch zwischen einer relationalen DB und Objekte, aber ohne IDs, es ist keine Möglichkeit zu sagen, einen Gegenstand vom anderen, wenn man es bearbeitet.

Gibt es eine elegante Art und Weise zu teilen, einen Hersteller von Produkten, ohne duplizieren von Daten?Oder sollte ich einfach die Verwendung einer relationalen DB?

War es hilfreich?

Lösung

Sie können DB4O in Ihrer Konfiguration einen eindeutigen Index hinzufügen.

configuration.Common.ObjectClass(typeof (Manufacturer)).ObjectField("<Name>k__BackingField").Indexed(true);
configuration.Add(new UniqueFieldValueConstraint(typeof(Manufacturer), "<Name>k__BackingField"));

Auf diese Weise ist es nicht möglich, zwei verschiedene Herstellerobjekte mit demselben Namen in Ihrer DB zu haben. Der Feldname muss "k__backingfield" sein, da Sie automatische Eigenschaften verwenden. Natürlich können Sie eine Ganzzahl -ID hinzufügen und sie genauso indexieren.

Andere Tipps

Die grundlegenden Dinge zuerst.db4o verwaltet Objekte durch Ihre Objekt-Identität.Wenn Sie laden das gleiche Objekt-Instanz erneut, db4o wird, aktualisiert das Objekt in der Datenbank.Das gleiche gilt für Referenzen.Wenn zwei verschiedene Objekte verweisen auf dasselbe Objekt an, Sie beziehen sich eigentlich auf das selbe Objekt in der Datenbank.In Ihrem Beispiel:Wenn zwei verschiedene Produkt finden Sie auf der gleichen Hersteller-Instanz, Sie verweisen auch auf die gleichen Herstellers in der Datenbank.Dies wird dadurch erreicht, dass eine Tabelle in der back-Boden verfolgt die Objekte.

Jetzt hat dieser Ansatz Probleme.Sobald Sie Objekte serialisieren, (web-Anwendung, web-services etc.), oder in der Nähe der Objekt-container, db4o vergisst das Objekt im Speicher gehört zu dem Objekt.Dann hilft es nicht, erkennt ein vorhandenes Objekt mehr, und speichert nur ist wie ein neues Objekt.Dies bedeutet, dass Sie sollten nie zu laden und speichern Sie ein Objekt mit verschiedenen Objekt-container-Instanz.Und, dass Sie wahrscheinlich brauchen IDs erkennt Objekte.Für Beispiel, zu erkennen, ein Objekt über das web-Anfragen.Eine einfache Lösung ist die Verwendung von Guids zu geben eine eindeutige id auf ein Objekt.

Zurück zu deiner Frage.Teilen die Hersteller zwischen Produkte, die Sie einfach Punkt es an der gleichen Hersteller.Wie diese:

Product newShinyProduct = new Product(); // the new thing
// Get a existing product or manufacturerer, doesn't matter
Product oldProduct = (from p in container.AsQueryable<Product>()
                     where p.Name == "Get a product"
                     select p).First();

// now just assigne the existing manufacturer to the new product
// this product will now refer to the same manufacturer
// and db4o will store this that way. The manufacturer isn't doublicated.
newShinyProduct.Manufacturer = oldProduct.Manufacturer;
// store the new product in the database.
container.Store(newShinyProduct);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top