hierarquias de classe e interface em Entity Framework?

votos
11

Eu tenho duas classes relacionadas que compartilham uma interface comum e ambos são armazenados na mesma tabela de banco de dados subjacente. No entanto, o Entity Framework gera uma classe comum, onde eu realmente preciso as duas classes distintas. Como posso resolver isso? É melhor usar uma classe base, em vez de uma interface? Como faço para mudar o modelo EF para fornecer duas classes mapeadas mais de uma mesa?

Edit: a propriedade AccountType determina o tipo de classe; de utilizador ou grupo.

Um código simples:

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; }
}
Publicado 09/12/2008 em 17:05
fonte usuário
Em outras línguas...                            


1 respostas

votos
14

É este dados discriminados? ou seja, faz AccountType definir qual o tipo que é? Se então:

  • EF deve criar a entidade de conta do armazenamento
  • Você, então, criar 2 subclasses (useraccount e GroupAccount)
  • no mapeamento de Conta, especifique um predicado "adicionar uma condição"
    • tê-lo mapear para useraccount onde o campo AccountType (armazenamento) é 1 (ou qualquer outro)
    • tê-lo mapear para GroupAccount onde o campo AccountType (armazenamento) é de 2 (ou qualquer outro)

O tipo de conta, em seguida, deve desaparecer completamente do objeto Account (unmap-lo se não). Para obter apenas os registros useraccount, você usa

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

A classe Conta provavelmente deve ser abstrato neste modelo. O material de interface pode ser adicionado por meio de uma classe parcial - ie num ficheiro separado, definir:

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

etc

Um passo a passo razoável é aqui .

Respondeu 09/12/2008 em 17:09
fonte usuário

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