2010-04-02 11 views
7

ich eine Tabelle Benutzer haben und einen Tisch ArtikelVerwenden mehrerer Fremdschlüssel auf die gleiche Tabelle in LINQ

In der Tabelle Artikel habe ich Felder wie

ModifiedBy CreatedBy AssignedTo

die Alle haben eine userId-Ganzzahl. Die Datenbank ist so eingerichtet, dass sie diese als Fremdschlüssel in die Tabelle Benutzer zurückversetzt.

Wenn LINQToSQL verwenden, die Beziehungen, die aus dem dbml automatisch gebaut geben am Ende mir Namen wie Benutzer, User1 und User2

z.B. myItem.User1.Name oder myItem.User2.Name

Offensichtlich ist dies nicht sehr gut lesbar ist und ich würde es nach dem Vorbild der

myItem.CreatedByUser.Name oder myItem.ModifiedByUser.Name etc sein mag

Ich könnte die Namen der Beziehungen ändern, aber das bedeutet, dass ich das jedes Mal neu vornehmen muss, wenn ich das db-Schema ändere und die dbml aktualisiere.

Gibt es einen Weg dahin?

+0

http://blogs.vertigo.com/personal/petar/Blog/archive/2008/01/29/multi-field-foreign-key-relationship-to-the-same-database-table-and-linq .aspx Dieser Blog erwähnt das gleiche Problem, aber die Lösung ist nicht richtig für mich, da ich ständig mein DB-Schema ändere und nicht viel manuelles Zeug jedes Mal machen muss, wenn ich es ändere – Graeme

Antwort

1

Die einfache Antwort: Nein

Jemand hat die Idee der Schaffung Teilassoziationsklassen vorgeschlagen, wo die Eigenschaftsnamen definiert, aber das wird nicht funktionieren entweder: Renaming LINQ 2 SQL Entity Properties Through Partial Classes.

Sie können entweder etwas Zeit damit verbringen, mehr über LINQ-to-SQL "hinter den Kulissen" zu erfahren, damit Sie die erforderlichen Änderungen manuell vornehmen oder die Eigenschaftsnamen über das Eigenschaftenfenster ändern können. Persönlich lösche ich einfach/Redrag/Umbenennen, weil es keine Schmerzen macht, eine Eigenschaft richtig einzustellen, weil die Ausnahmen, die geworfen werden, Ihnen wenig bis keine Ahnung geben, was sie verursacht hat. Ich bin sogar so weit gegangen, eine Komponententestbibliothek zu erstellen, die jedes MetaTable-Objekt in das Modell aufnimmt und die Feldanzahl, den ServerDataType-Inhalt jedes Felds, die Assoziationszahl, die Namen jeder Assoziation und die Namen jedes Endes von der Verein. Mit wenigen Änderungen führe ich die Unit-Tests durch, um sicherzustellen, dass das Modell intakt ist.

1

Erstens, nein ... Die Namen werden basierend auf der zweiten Tabelle in der Beziehung erstellt.

Aber was Sie wissen sollten, ist, dass Sie nicht "aktualisieren" müssen (dh, löschen Sie die Tabelle in der DBML und ziehen Sie sie dann erneut).

Für das Projekt, an dem ich arbeite, haben wir über 200 Tabellen ... ungefähr 50 davon haben wir manuell angepasst, nachdem wir sie aus der Datenbank gezogen haben. Wir nie Tabellen löschen und erneut ziehen, da es so viele Änderungen nach der automatischen Generierung gab.

+0

Für mich Es ist vorzuziehen, zu löschen und neu zu schreiben, da zumindest die Anwendung der Änderungen basierend auf der SqlMetal-Engine konsistent ist. Ich würde lieber das Eigenschaftenfenster verwenden, um einige Namen zu ändern, anstatt eine AutoSync-Eigenschaft festzulegen, da die ausgelösten Ausnahmen nur wenig Anhaltspunkte dafür liefern, wie sie gelöst werden können. –

+0

Jedem sein eigenes :) ... es ist kein perfektes System (LINQ to SQL), also ist alles, was für dich am einfachsten ist, wirklich die Antwort. Wir haben es genauso gemacht wie du, aber irgendwann ist es außer Kontrolle geraten. –

0

Sie könnten linq zu sql ohne die dbml verwenden es könnte zusätzliche Arbeit im Voraus sein, aber aus der Perspektive einer Änderung an einer Tabelle Spalte Name kann es einfacher als Änderungen an der DBML, wie Sie beschrieben haben.

0

Ich schlage vor, Erweiterungsmethoden zu erstellen, die die gewünschten Namen den Namen zuordnen, die Sie aus dem automatisch generierten Code erhalten. Auf diese Weise müssen Sie nach jeder automatischen Generierung den automatisch generierten Code nicht ändern, sondern nur Ihre eigenen Erweiterungsmethoden. Das, plus die Unit-Tests, um die Plausibilitätsprüfungen wie anderswo auf dieser Seite vorgeschlagen, sollten gut funktionieren.

Ich habe gerade dieses Problem selbst konfrontiert und ich versuche, meinen eigenen Vorschlag zu implementieren.

EDIT: Dies scheint relevant: SQLMetal Multiple Foreign Keys Pointing to One Table Issue

1

ich nur eine kleine Teil Klasse hinzufügen, um das Objekt mit entsprechend benannten Eigenschaften zu erweitern, zB unter:

namespace Database.TableModels { 
    partial class WTSR_Induction { 
     public EmailTemplate ConfirmationEmailTemplate { 
      get { return EmailTemplate1; } 
     } 
     public EmailTemplate InviteEmailTemplate { 
      get { return EmailTemplate; } 
     } 
    } 
} 

In diesem Beispiel ist die WTSR_Inductions Tabelle hat zwei Links zu der EmailTemplates Tabelle, daher die EmailTemplate und EmailTemplate1 Eigenschaften.

+0

Es ist irgendwie hässlich, aber wahrscheinlich die beste Lösung in vielen Fällen. –

1

Ein bisschen spät, aber Sie können dies tun, indem Sie die Beziehung im linq-Modell auswählen und zu Eigenschaften wechseln und den Namen der übergeordneten Eigenschaft aktualisieren.

Verwandte Themen