Frage

Ich habe folgendes Schema in der Datenbank:

  • BillingReferences (ReferencingType Tinyint , ReferencingId Tinyint , ReferencedType Tinyint , ReferencedId Tinyint , IsActive Bit .) - in dem alle Felder (außer IsActive) Teil eines eindeutigen Index
  • BillingType (BillingTypeId Tinyint , Name varchar (50) )

ReferencingType und ReferencedType ist ein Fremdschlüssel von BillingTypes. BillingTypes enthält die folgenden Zeilen:

BillingTypeId | Name

1 | Labels

2 | Die Länder

3 | PaymentProviders

4 | Zahlungs

5 | Banks

ReferecingId und ReferencedId stellt die Id einer der folgenden Einheiten (abhängig von der referenzierten / Referenzierung Type):

  • Banken (BankID Tinyint , Name varchar (50) )
  • Länder (CountryId Tinyint , Name varchar (50) )
  • Labels (LabelId Tinyint , Name varchar (50) )
  • PaymentProviders (PaymentProviderId Tinyint , Name varchar (50) )
  • Zahlungsoptionen (PaymentOptionId Tinyint , Name varchar (50) )

In der Zukunft jedes Unternehmen wird einige weitere unterschiedliche Spalten hinzugefügt haben, aber jetzt ist dieses das Schema der Einfachheit halber.

Es gibt eine Verbindung von (1- ) zwischen jeder Einheit (mit Ausnahme von Ländern) zu Ländern. Labels haben eine Verbindung von (1 - ) zu Banken, PaymentProviders und zahlungs. Und PaymentProviders hat eine Verbindung von (1- *) zu PaymentProviders

So zum Beispiel, wenn ich eine Bank mit BankID 201 in ein Land mit CountryId 3003 verbinden möge Ich werde einen Datensatz in BillingReferences hat, die so aussehen: ReferencingType = 5 ReferencingId = 201 ReferencedType = 2 ReferencedId = 3003 IsActive = 1

Wir haben keine Verbindung / Referenztabelle wegen extendability Gegenleistung für jede Verbindungsart machen - Wenn wir ein anderes Unternehmen alles, was wir tun müssen, hinzufügen möchten seine Tabelle hinzufügen und fügen Sie Datensätze für sie in BillingReferences und BillingType <. / p>

Das Problem ist, dass ich nicht einen bedingten Fremdschlüssel zwischen BillingReferences und jede der Einheiten konfigurieren kann, und ich kann nicht zu konfigurieren, scheinen / wo es dich mit EntityFramework entweder ...

Ich konnte keinen Tutorial oder Beispiel finden, die diese Art der Implementierung verwendet. Bin ich verpflichtet, eine Referenztabelle für jede Verbindung zu erstellen, oder gibt es eine Möglichkeit, dies mit EntityFramework zu konfigurieren?

Danke für die Hilfe:)

War es hilfreich?

Lösung

AFAIK, gibt es nicht eine Möglichkeit, dies zu tun.

Ich würde gehen mit einer separaten Tabelle für jede Art zu schaffen, wenn Sie wirklich einen guten Grund, nicht zu haben. Die Betrachtung Sie erwähnen, ist nicht gut, IMHO.

mehr Tabellen Mit ermöglicht es Ihnen, Fremdschlüssel-Constraints auf Ihre Schlüssel zu setzen, und es übersetzt gut in die EF. Es hilft auch, Leistung:. Ihre große Esel Referenztabelle mit einer Million Zeilen wird mehr Zeit in Anspruch nehmen als mehr kleineren Tabellen abfragen (es sei denn, Sie IMMER alle Verweise für eine Art wollen)

Andere Tipps

Nicht nur gibt es keine Möglichkeit, dies in der Entity Framework zu tun, gibt es keine Möglichkeit, es in SQL zu tun, auch nicht. Sie können keine Fremdschlüssel haben, die eine von fünf verschiedenen Tabellen verweist.

Was ich glaube, Sie sollten stattdessen zu tun ist, einen Elternteil zu haben, abstrakten Referenztyp und die konkreten Typen Subtypen diesen Elterntyp zu machen. Jetzt haben Sie nur einen Fremdschlüssel, an einen Tisch. Sie können Tabelle pro Typ oder eine Tabelle pro Hierarchie Mapping auswählen. Vorausgesetzt, dass Sie keine speziellen Spalten überhaupt in einen der Typen, die Sie erwähnen, würde ich denken, dass Tabelle pro Hierarchie Mapping wäre eine bessere Wahl für Sie sein

Die einzige Möglichkeit, erreichen konnte, was man wollte, ist ein Auslöser bauen die Verarbeitung auf der Serverseite zu behandeln. Sie können nicht FK ist wie die auf mehrere Tabellen abzubilden. Aber ein Trigger kann diese Logik behandeln. Natürlich, die völlig außerhalb EF wäre ...

Ich würde Ihnen empfehlen, auch eine separate Tabelle für jede Art zu bauen. Einfachere auf lange Sicht zu halten, denke ich.

Nun, ich denke, ich werde Benutzer Inferis Vorschlag und eine separate Tabelle für jede Art erstellen.

Danke Jungs für Ihre Antworten - sie halfen A LOT :)

In SQL können Sie eine Ansicht für jeden auf einer einzigen Tabelle basiert Typ erstellen. Jede Ansicht kann verbindet ausführen Informationen abzurufen im Zusammenhang mit nur diesem Typ. dies ermöglicht es Ihnen auch die Links als Ganze zu denken, ihre Art zu ignorieren.

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