Announcement

Collapse
No announcement yet.

LINQ-to-SQL: Vererbung & Zuordnung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • LINQ-to-SQL: Vererbung & Zuordnung

    Hallo,

    ich habe ein Problem mit dem O/R-Designer. Ich habe eine Klasse "Person" erstellt mit einer Eigenschaft FamilieId. Von dieser Klasse erben die Klassen "Kind" und "Eltern". Ausserdem gibt es noch eine Klasse "Familie".

    Ich möchte nun eine Zuordnung Familie.Id->Kind.FamilieId und Familie.Id->Eltern.FamilieId erstellen. Wenn ich es mit dem Designer mache, klappt es nicht, da im Assistenten die vererbte Eigenschaft FamilieId nicht auftaucht.

    Füge ich nun die Eigenschaft FamilieId bei Kind & Eltern hinzu, meckert VS 2008 wegen der verdeckten Eigenschaft und ich sollte doch bitte new verwenden.

    habe ein bischen mit den Vererbungsmodifizierer rumgespielt und Person.FamilieId als "virtual" deklariert und bei Kind.FamilieId & Eltern.FamilieId als "override", er meckert aber trotzdem wegen der Variable _FamilieId.

    Kann mir jemand erklären, wie ich mit dem Designer eine Zuordnung bei vererbten Eigenschaften hinbekommen kann?

    Vielen Dank und Gruß,

    Kai

  • #2
    Hallo,

    Wenn ich es mit dem Designer mache, klappt es nicht, da im Assistenten die vererbte Eigenschaft FamilieId nicht auftaucht.
    Ist im Designer etwas versteckt, aber vorhanden. In der Toolbox sind die Elemente für das O/R-Design (wechseln vom Datenbank-Explorer) mit denen die Vererbung erstellt werden kann. Wenn du dann auf die "Vererbungslinie" klickst ist (rechts) im Eigenschaftsfenster die Einstellmöglichkeit für den Vererbungsdiskriminator und den -standard.

    Ansonsten kannst du dich am Gewusst wie orientieren.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Morgen,

      danke für die Antwort, aber mit der Vererbung hat es eigentlich bei mir alles geklappt. Mein Problem ist bei der Zuordnung, dass die vererbte Klasse die Zuordnungseigenschaft nicht darstellt. Die FamilieId "existiert" für den O/R-Designer scheinbar nur in der Basisklasse. Jedenfalls hat meine abgeleitete Klasse im Zuordnungseditor nicht die Eigenschaft "FamilieId".


      Gruß

      Comment


      • #4
        Mein Problem ist bei der Zuordnung, dass die vererbte Klasse die Zuordnungseigenschaft nicht darstellt.
        Im O/R-Designer wird die Discriminator-Eigenschaft nur in einer Entität dargestellt (der Basisklasse).

        Wie bei "normaler" Vererbung erben die abgeleiteten Klassen diese Eigenschaft von der Basisklasse.


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Wie gesagt, mit der Vererbung an sich habe ich kein Problem. Wenn ich die Zuordnung weglasse, dann wird alles korrekt in der Datenbank gespeichert.

          Ich möchte nur gerne über die Interselektionstabelle "Familie" eine Zuordnung erstellen. Nur im Zuordnungseditor erscheint bei der Klasse "Kind" und "Eltern" nicht die Eigenschaft FamilieId. Wenn ich aus den "Kind" und "Eltern" Klassen Objekte erstelle, dann wurde FamilieId auch korrekt vererbt.

          Nur eben in diesem Zuordnungseditor erscheint es nicht. Wenn ich den beiden Klassen dann doch noch eine Eigenschaft "FamilieId" hinzufügen, klappt es dann zwar mit der Zuordnung, allerdings meckert er dann, dass die FamilienId der Kind und Eltern Klasse die FamilieId der Person-Klasse verdeckt.

          Lösche ich im Quellecode dann das Property und die Variable "FamilienId" aus der "Kind" und "Eltern" klappt es auch wieder, allerdings sobald ich das Modell ändere, werden diese Eigenschaften vom Designer wieder zum Quellcode hinzugefügt.

          Ich hoffe, du verstehst, was ich meine.

          Gruß

          Comment


          • #6
            Ich habe noch einmal ein Screenshot angehängt, damit man verstehen kann was ich vorhabe.

            Wenn ich nun aus dem Modell die Datenbank erstellen möchte, erhalte ich folgende Exception:

            System.InvalidOperationException wurde nicht behandelt.

            Fehlerhafte Storage-Eigenschaft: "_FamilieId" im Element "Datenmodell.Eltern.FamilieId".
            Attached Files

            Comment


            • #7
              Hm..., ich glaube die verstehtst Vererbung nicht. Lies dir mal die Kapitel über Vererbung im OpenBook durch.

              Wenn du das verstanden hast löst sich dein Problem von selbst


              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Sorry, das Kapitel habe ich schon gelesen und ich denke das ich schon Vererbung verstehe.

                Momentan stehe ich echt auf dem Schlauch.

                Die abgeleiteten Klassen sollen nicht noch einmal die Eigenschaft FamilieId haben, da sie es ja von der Basisklasse "Person" geerbt bekommen. Ich MUSS aber die Eigenschaft "FamilieId" noch einmal hinzufügen, da sonst der Zuordnungseditor des O/R-Designers mir nicht die geerbte Eigenschaften anzeigt. Ich brauche nicht noch einmal diese Eigenschaft in den abgeleiteten Klassen, nur der Editor "zwingt" mich dazu oder ich habe etwas grundlegendes übersehen.

                Wie gesagt, aus meiner Sicht habe ich kein Problem mit der Vererbung, sondern mit der Zuordnung.

                Gib mir bitte noch mal einen Tipp. Hab nun schon alles mögliche probiert, komme aber nicht voran und so etwas halbgares wie mit dem entfernen der Eigenschaften im Quelltext gefält mir auch nicht.

                Es muss doch einen Möglichkeit mit dem Designer geben.

                Habe noch einmal einen Screenshot angehängt. Wie bekomme ich jetzt eine Zuordnung hin von Familie.Id -> Kind.FamilieId und Familie.Id -> Eltern.FamilieId ?

                Eltern und Kind haben ja die Eigenschaft geerbt, aber es klappt einfach nicht mit dem Editor. Er zeigt mir nicht die FamilieId an.



                Gruß
                Attached Files
                Zuletzt editiert von bluestardev; 14.09.2009, 13:05.

                Comment


                • #9
                  Du übersiehst einfach nur das Person mit Familie in Beziehung steht. Dazwischen gehört die Assoziation.

                  Wenn du doch die Beziehung explizit zwischen Eltern/Familie und Kind/Familie möchtest weil du die Rollen in einer Familie unterscheiden willst dann musst du FamilieId aus Person rauswerfen das es ja dann auch keine allgemeine Bedeutung von Familie mehr gibt sondern nur eine spezielle der jeweiligen Ableitung.

                  Comment


                  • #10
                    Danke für deine Antwort Ralf.

                    Mein erstes Design sah auch vor, dass FamilieId in den abgeleiteten Klassen steht, allerdings meckert dann VS rum, das FamilieId zweimal vergeben wurde.

                    Daher dachte ich, dass es vernünftiger ist die FamilieId in der Basisklasse zu lassen, damit ich in der Datenbank nur eine Spalte habe und nicht zwei z.B. KindFamilieId und ElternFamilieId.

                    Ich muss Kind und Eltern unterscheiden können und deswegen habe ich es so gemacht.

                    Wenn ich z.B. die Eltern eines Kindes brauche könnte ich dann über objKind.Familie.Eltern darauf zugreifen oder alle Geschwister über objKind.Familie.Kind.

                    Dies lässt sich bei einer Zuordnung Familie.Id->Person.FamilieId nicht so einfach realisieren oder sehe ich das falsch.

                    Gruß

                    Comment


                    • #11
                      Hab mich geirrt. Ich kann ja über die Where-Klausel abfragen ob es Kinder oder Eltern sind.

                      z.B.

                      var res = from pers in ctx.Person
                      where pers is Kind
                      select pers;

                      für alle Kinder.

                      Ich denke mein Problem ist gelöst und danke noch einmal für Eure Hilfe.

                      Gruß

                      Comment

                      Working...
                      X