¿Jerarquías de clase e interfaz en Entity Framework?

votos
11

Tengo dos clases relacionadas que comparten una interfaz común y ambas están almacenadas en la misma tabla de base de datos subyacente. Sin embargo, Entity Framework genera una clase común, donde realmente necesito las dos clases distintas. ¿Cómo resuelvo esto? ¿Es mejor usar una clase base en lugar de una interfaz? ¿Cómo cambio el modelo EF para proporcionar dos clases mapeadas en una tabla?

Editar: la propiedad AccountType determina el tipo de clase; usuario o grupo.

Un código simple:

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 el 09/12/2008 a las 17:05
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
14

¿Esta información es discriminada? es decir, ¿AccountType define qué tipo es? Si es así:

  • EF debe crear la entidad de cuenta desde el almacenamiento
  • luego creas 2 subclases (cuenta de usuario y cuenta grupal)
  • en el mapeo de Cuenta, especifique un predicado "agregar una condición"
    • hacer que se asocie a UserAccount donde el campo AccountType (almacenamiento) es 1 (o lo que sea)
    • hacer que se asocie a GroupAccount donde el campo AccountType (almacenamiento) es 2 (o lo que sea)

El tipo de cuenta entonces debería desaparecer por completo del objeto Cuenta (desasignar si no). Para obtener solo los registros de cuenta de usuario, usa

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

La clase de la cuenta probablemente debería ser abstracta en este modelo. Las cosas de la interfaz se pueden agregar a través de una clase parcial, es decir, en un archivo separado, defina:

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

etc

Un recorrido razonable está aquí .

Respondida el 09/12/2008 a las 17:09
fuente por usuario

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