5 Stimmen

Wie kann man die automatisch erzeugte Spalte "Diskriminator" im EntityFramework ändern?

Ich arbeite gerade an einem Code, der die Vererbung einer einzelnen Tabelle über EF4.3 nutzt.

Es gibt eine Entität namens User und eine weitere Entität namens Admin. Admin erbt von User.

Benutzerklasse

public class User
{
    public int Id {get;set;}
    public string Username {get;set;}
}

Verwaltungsklasse

public class Admin : User { }

EF hat die Datenbanktabellen mit einer Discriminator Spalte. Wenn eine Admin Datensatz hinzugefügt wird, dann Discriminator="Admin" und ein Benutzerdatensatz hätte Discriminator="User" .

Meine Frage ist, wie aktualisiere ich die Discriminator Spalte, wenn ich eine User in und Admin ?

Ich habe versucht, von einem Objekttyp zum anderen zu wechseln und mit EF zu speichern, aber das ändert die Discriminator-Spalte nicht. Wie kann ich sie ändern?

Danke für jede Hilfe.

7voto

Craig Stuntz Punkte 124703

Objekte können ihren Typ nicht ändern, niemals. Wenn Sie die "Administrator"-Einstellung für einen Benutzer (sinnvoll) ändern wollen, sollten Sie dies mit einem Attribut/einer Eigenschaft tun, nicht mit einem Typnamen.

Sie könnten zum Beispiel eine Assoziation zwischen einer User Objekt und ein Administrator Objekts, anstatt zu wollen ersetzen. le site User Objekt mit einer Administrator Untertyp.

Ich habe über diese Idee in einem alten Blogbeitrag geschrieben :

Eine der mentalen Barrieren, die Sie beim Entwurf einer guten objektrelationalen Abbildung überwinden müssen, ist die Tendenz, hauptsächlich in objektorientierten Begriffen oder in relationalen Begriffen zu denken, je nachdem, was zu Ihrer Persönlichkeit passt. Ein gutes objektrelationales Mapping beinhaltet jedoch sowohl ein gutes Objektmodell als auch ein gutes relationales Modell. Nehmen wir zum Beispiel an, Sie haben eine Datenbank mit einer Tabelle für Personen und damit verbundenen Tabellen für Mitarbeiter und Kunden. Eine einzelne Person könnte in allen drei Tabellen einen Datensatz haben. Aus streng relationaler Sicht könnten Sie nun eine Datenbank-VIEW für Mitarbeiter und eine weitere für Kunden erstellen, die beide Informationen aus der Personentabelle enthalten. Wenn Sie die eine oder andere VIEW verwenden, können Sie eine einzelne Person vorübergehend als "nur" einen Mitarbeiter oder "nur" einen Kunden betrachten, obwohl Sie wissen, dass sie beides ist. Jemand, der aus dieser Weltanschauung kommt, könnte also versucht sein, eine OO-Abbildung vorzunehmen, bei der Employee und Customer beide (direkte) Unterklassen von Person sind. Da eine einzelne Person sowohl Mitarbeiter- als auch Kundendatensätze hat (und da keine Person-Instanz gleichzeitig dem konkreten Untertyp Employee und Customer angehören kann), muss die OO-Beziehung zwischen Person und Employee eher eine Komposition als eine Vererbung sein, und das Gleiche gilt für Person und Customer.

Um Ihre Frage direkt zu beantworten: Es gibt keine Möglichkeit, diese Spalte mit EF zu ändern. Sie könnten es natürlich in direktem SQL tun. Aber aus den oben genannten Gründen würde ich Ihnen raten, dieses Design zu ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X