2010-12-15 10 views
1

Ich habe eine Tabelle in meiner Datenbank zu speichern Einzelteilen erhalten:Modellierung verbundene Unternehmen mit SQL Server und Entity Framework

Items 
------- 
ItemID 
Name 
... 
Etc 

und eine separate Tabelle, die die PK von zwei verschiedenen Elementen aus der ersten Tabelle zu speichern. Ich möchte in der Lage sein, den einen Artikel und dann eine beliebige Anzahl von verwandten Artikeln aufzulisten. Ich habe Beispiele versucht gesucht, aber nicht viel überraschend gefunden ...

RelatedItems 
------------ 
ItemID 
RelatedItemID 

Wenn ich vier Produkte, deren IDs 1, 2, 3 und 4 ... und 1 bezieht sich auf die 2 und 3 ich könnte Daten haben, die wie folgt aussieht:

ItemID RelatedItemID 
1  2 
1  3 
4  1 

ich Modellierung sie dann im Entity Framework Designer, und der Designer fügt automatisch eine Verbindung aus der Elemente Tabelle mit sich selbst (viele zu viele). Der Designer fügt auch zwei Navigationseigenschaften hinzu, wenn ich die erste Eigenschaft für Objekt Nr. 1 verwende, bekomme ich alle Elemente, bei denen Element Nr. 1 in der ersten Spalte ist, und wenn ich die zweite Eigenschaft verwende, bekomme ich alle Elemente, in denen sich Element Nr. 1 befindet die zweite Spalte.

Ich möchte jedoch nur eine Navigationseigenschaft haben, wo ich Items.RelatedItems sagen kann und es gibt alle Elemente zurück, die die beiden obigen Eigenschaften kombiniert würden. Ich weiß, dass ich die beiden Ergebnisse nach der Tat beitreten kann, aber ich kann nicht helfen zu denken, dass ich etwas falsch mache, und es gibt einen besseren Weg.

Hoffentlich ist das alles klar genug.

Antwort

1

Es klingt wie SQL-Schemas sind nur nicht sehr gut bei der Modellierung des Konzepts, das Sie suchen. Das Schema, das Sie gewählt haben, würde gut funktionieren, wenn Sie eine Richtungsbeziehung herstellen möchten (Punkt A bezieht sich auf Punkt B, aber Punkt B kann sich auf Punkt A beziehen oder nicht). Wenn Sie nach einer Gruppierungsstil-Beziehung suchen (Elemente A und B sind in derselben Gruppe), kann ich mir einen anderen Ansatz vorstellen, den Sie verwenden würden. Aber ich kann mir keine gute Möglichkeit vorstellen, eine inhärent bidirektionale Beziehung mit einer traditionellen relationalen Datenbank zu modellieren. Es kann einige Problemumgehungen geben, eine View zu verwenden, die die beiden Ergebnisse verbindet, oder Trigger zu verwenden, um sicherzustellen, dass jede Zuordnung von A nach B eine entsprechende Zuordnung von B nach A aufweist, so dass beide Eigenschaften immer den Wert zurückgeben gleiche Objekte.

0

Wenn Sie eine Instanz eines Elements haben, rufen Sie es Artikel, dann die folgenden wird Ihnen die zugehörige Artikel ...

item.RelatedItems.Select(ri => ri.Item); 

Ihre RelatedItems Eigenschaft zum Produkt (dh die erste Navigationseigenschaft Sie erwähnt) Dies ist eine Sammlung von RelatedItem-Objekten, von denen jedes zwei eigene Navigationseigenschaften besitzt, von denen eines als Item bezeichnet wird und ein Link zum zugehörigen Item ist.

Beachten Sie, dass dies der Luftcode ist, da ich nicht vor irgendetwas bin, was ich jetzt testen kann, aber ich denke, das wird tun, was Sie wollen.

Wenn Sie es einfacher machen möchten, können Sie eine Erweiterungsmethode einpacken die Select(), so etwas schreiben ...

public static IEnumerable<Item> RelItems(this Item item) { 
    return item.RelatedItems.Select(ri => ri.Item); 
} 

Dann könnten Sie gerade tun ...

item.RelItems(); 

Beachten Sie, dass ich die Erweiterungsmethode RelatedItems nicht nennen konnte, da dies mit der Navigationseigenschaft kollidieren würde, die EF für die zweite Tabelle erstellt hätte.Das ist vielleicht kein guter Name für diese Tabellen, da es nicht die tatsächlichen Elemente sind, sondern die IDs der Elemente. In beiden Fällen sollte der obige Code funktionieren.

Verwandte Themen