Klassen- und Interface-Hierarchien in Entity Framework?

stimmen
11

Ich habe zwei verwandte Klassen, die eine gemeinsame Schnittstelle zu teilen und beide sind in der gleichen zugrunde liegenden Datenbanktabelle gespeichert. Allerdings erzeugt das Entity Framework eine gemeinsame Klasse, wo ich wirklich die zwei verschiedenen Klassen benötigen. Wie behebe ich das? Ist es am besten, eine Basisklasse zu verwenden, anstatt eine Schnittstelle? Wie ändere ich das EF-Modell ändern zwei Klassen über eine Tabelle abgebildet bieten?

Edit: die Eigenschaft Account bestimmt die Art der Klasse; Benutzer oder eine Gruppe.

Einige einfache Code:

public interface IAccount
{
    string Name { get; set; }
    AccountType AccountType { get; set; }
}

public class GroupAccount : IAccount
{
    public string Name { get; set; }
    public GroupType GroupType { get; set; }
    public AccountType AccountType { get; set; }
}

public class UserAccount : IAccount
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Name { get; set; }
    public AccountType AccountType { get; set; }
}
Veröffentlicht am 09/12/2008 um 17:05
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
14

Diese Daten werden diskriminiert? dh tut Account zu definieren, welche Art es ist? Wenn ja:

  • EF sollte die Entität Konto aus dem Speicher erstellen
  • Sie erstellen dann zwei Unterklassen (Useraccount und GroupAccount)
  • in der Mapping für Konto, geben Sie ein Prädikat „fügen Sie eine Bedingung“
    • haben wo es sich auf Benutzer-Account, wo die Account (Speicher) Feld 1 (oder was auch immer) ist
    • haben wo es sich GroupAccount wo die Account (Lagerung) Feld 2 (oder was auch immer) ist

Der Kontotyp sollte ganz verschwinden aus dem Konto-Objekt (unmap es, wenn nicht). Um nur die Useraccount Datensätze, die Sie verwenden

 .Accounts.OfType<UserAccount>()...

Die Kontoklasse soll wohl in diesem Modell abstrakt sein. Das Interface Material kann über eine partielle Klasse hinzugefügt werden - also in einer separaten Datei definieren:

partial class Account : IAccount {
   // extra code here
}

etc

Ein vernünftiger Durchlauf ist hier .

Beantwortet am 09/12/2008 um 17:09
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more