Klasy i interfejsu hierarchie w Entity Framework?

głosy
11

Mam dwóch powiązanych klas, które mają wspólny interfejs i oba zapisane w tej samej podstawowej tabeli bazy danych. Jednak Entity Framework generuje jedną wspólną klasę, gdzie naprawdę potrzeba dwóch różnych klas. Jak mogę rozwiązać ten problem? Jest to najlepiej użyć klasy bazowej zamiast interfejsu? W jaki sposób mogę zmienić model EF dostarczenie dwóch klas odwzorowane na jednym stole?

Edit: własność AccountType określa rodzaj klasy; Użytkownik lub grupy.

Niektóre prosty kod:

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; }
}
Utwórz 09/12/2008 o 17:05
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
14

Czy te dane dyskryminowany? czyli robi AccountType określić jakiego typu to jest? W takim razie:

  • EF powinien utworzyć podmiot konto z pamięci
  • następnie utworzyć 2 podklasy (konto_użytkownika i GroupAccount)
  • w mapowaniu na rachunek określ predykat „dodać warunek”
    • mają to mapa do konto_użytkownika gdzie (przechowywanie) Pole AccountType jest 1 (lub cokolwiek)
    • mają to mapa do GroupAccount gdzie (przechowywanie) Pole AccountType jest 2 (lub cokolwiek)

Typ konta, a następnie powinien całkowicie zniknąć z obiektu Account (unmap niego, jeśli nie). Aby uzyskać tylko rekordy konto_użytkownika, należy użyć

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

Klasa rachunku powinien prawdopodobnie streszczenie w tym modelu. Rzeczy interfejs może być dodany poprzez częściowe klasy - tj w oddzielnym pliku, określić:

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

itp

Rozsądnym solucja jest tutaj .

Odpowiedział 09/12/2008 o 17:09
źródło użytkownik

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