1

Warum kann ich ein Mitglied mit demselben Namen nicht in Unterklassen definieren? Ich habe eine Tabelle pro Klassenvererbung mit einem rowversion timestamp Feld in jeder Tabelle. Es scheint, als ob der Entity-Designer dies zulassen und das Schlüsselwort new auf der Property verwenden sollte, um dies zu ermöglichen. Was ist die Problemumgehung? Wie kann ich dasselbe Feld in einer Vererbungskette mit anderen Werten angeben, wenn ich new nicht verwenden kann? Dies kann für andere Datenbanken wahr sein, die rowguids haben, modifiedbys, modifieddates usw.Entity Framework: Wie kann ich eine Tabelle pro Klassenvererbung mit einem Zeilenversionsfeld aktivieren?

Edit: ich denke, den logischen Weg, um den Verweis auf das Feld zu tun, wäre es zu einfach umbenannt, dh PersonRowversion in der Student Klasse das kommt von Person.

Fehle ich ein Stück EF, das diese Art von Feldern automatisch verfolgen kann?

Antwort

5

Da eine Klasse nicht zwei Mitglieder mit demselben Namen haben kann. "neu" wird nicht tun, was Sie wollen. "neu" verbirgt das ererbte Mitglied; Es gibt Ihnen nicht zwei verschiedene Mitglieder mit dem gleichen Namen. Wenn der erzeugte Code also "neu" verwendet, können Sie niemals auf den Wert in der "übergeordneten Tabelle" von Ihrem C# -Code aus zugreifen. Es ist für beide Datenbanktabellen problemlos möglich, zwei Spalten mit demselben Namen zu verwenden. Sie müssen jedoch die doppelten Spaltennamen in Ihrem konzeptionellen Modell umbenennen, wenn zwei Tabellen eine Klasse bilden.

In Bezug auf "Änderungsdatum" usw., benötigen Sie in der Regel nur eines. Wenn Sie einen Super-Typ von Tier und einen Subtyp von Hund haben, betrachtet das Entity Framework eine Aktualisierung des "Tierabschnitts" oder des "Hundeteils" des Typs als Aktualisierung für die gesamte Instanz, genau wie C#.

Denken Sie daran, dass das konzeptionelle Modell und das Speichermodell unterschiedliche Dinge sind und nach unterschiedlichen Regeln spielen. Seien Sie vorsichtig beim Denken in streng OO oder streng relationalen Begriffen, wenn Sie in Ihrem Entitätsmodell arbeiten. Innerhalb des Entitätsmodells überbrücken Sie beide Welten. As I wrote elsewhere:

Eine der geistigen Hürden, die Sie überwinden müssen, wenn Sie ein gutes Objekt-Beziehungs-Mapping entwerfen, ist die Tendenz, primär in objektorientierten Begriffen oder relationalen Begriffen zu denken, je nachdem, was zu Ihrer Persönlichkeit passt. Ein gutes objektbezogenes Mapping beinhaltet jedoch sowohl ein gutes Objektmodell als auch ein gutes relationales Modell. Angenommen, Sie haben eine Datenbank mit einer Tabelle für Personen und zugehörigen Tabellen für Mitarbeiter und Kunden. Eine einzelne Person könnte einen Datensatz in allen drei Tabellen haben. Nun, aus einer streng relationalen Perspektive, könnten Sie eine Datenbank VIEW für Mitarbeiter und eine andere für Kunden erstellen, die beide Informationen aus der People-Tabelle enthalten. Wenn Sie die eine oder die andere Ansicht verwenden, können Sie vorübergehend eine einzelne Person als "nur" einen Mitarbeiter oder "nur" einen Kunden betrachten, obwohl Sie wissen, dass sie beide sind. Jemand, der aus dieser Weltanschauung kommt, könnte versucht sein, ein OO-Mapping durchzuführen, bei dem Mitarbeiter und Kunde beide (direkte) Unterklassen von Person sind. Aber das funktioniert nicht mit den Daten, die wir haben; Da eine einzelne Person sowohl Mitarbeiter- als auch Kundendatensätze hat (und da keine Personeninstanz gleichzeitig vom konkreten Subtyp Mitarbeiter und Kunde sein kann), muss die OO-Beziehung zwischen Person und Mitarbeiter eher Zusammensetzung als Vererbung sein, ebenso für Person und Kunde.

+0

Auch wenn die Eigenschaft mit Reflektion auf diesen (Vorfahren-) Typ getvaluiert wird? Ich vermute, das war eine Vermutung, die ich nie wirklich versucht habe, mich zu verifizieren. –

+0

Ehrlich gesagt, habe ich noch nie den "neuen" (im Sinne des Eigentumsversteckens) Einführungscode benutzt, daher weiß ich nicht, was Reflexion hier bewirkt. –

+0

@Craig Ich dachte EF hinter den Kulissen verwendet eine Menge Reflexion, um es passieren zu lassen, so dass es einfach "automatisch" passieren kann, wenn es "neu" ed es. Aber Annahmen sind nie gut in der Programmierung ... –

Verwandte Themen