2012-05-03 3 views
5

Je suis intéressé par la façon dont je peux mapper deux entités à la même table, en utilisant d'abord le code. Voici un exemple:Code EF Premier Plusieurs entités à la même table

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public byte Age { get; set; } 
    public bool Active { get; set; } 
    public DateTime Created { get; set; } 
} 

public class UserViewModel 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public byte Age { get; set; } 
} 

Fondamentalement, j'en ai marre des bâtiments de construction. Je veux mapper tous les modèles possibles pour le portail de configuration, le portail utilisateur, d'autres services dans modelbuilder et utiliser simplement DbContext pour tout. Je veux définir la classe User en haut de la hiérarchie et une classe qui construit la base de données, alors que tous les autres modèles devraient être là pour diverses applications.

Je ne veux pas utiliser automapper. J'ai aussi fait beaucoup de codage manuel, ce qui m'a fait perdre du temps, et chaque modification nécessite que je retourne dans le dépôt et que je recode, ce qui m'agace.

J'ai essayé de l'utiliser dans ModelBuilder, mais il me avertit que la hiérarchie est pas valide:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().Map(p => { p.ToTable("Users"); }); 
     modelBuilder.Entity<UserViewModel>().Map(p => { p.ToTable("Users"); }); 
    } 

Gardez à l'esprit que je ne cherche pas à obtenir « le fractionnement du tableau ». Je ne veux pas que ma table soit divisée en deux entités, je veux plutôt que toutes les colonnes soient valables, sauf une avec la clé primaire, et permettez aux différentes applications/services web/portails Web de remplir autant de données qu'elles ont été accordées accès pour.

Merci pour tous les conseils :)

+0

Jetez un oeil à la configuration du référentiel générique. Tout ce dont vous avez besoin est d'un référentiel unique pour toutes vos entités. Je ressens votre douleur, j'ai utilisé un référentiel pour chaque entité jusqu'à ce que je découvre le modèle de référentiels génériques. – JBeckton

Répondre

9

Vous ne pouvez pas. Une table = une entité (à l'exception des mappages avancés comme le fractionnement de table mentionné et l'héritage TPH). Voir le modèle n'est pas et l'entité. C'est juste la vue sur les données/projection, alors maniez-le comme ça. Vous travaillerez toujours avec l'utilisateur de l'utilisateur et projet pour voir le modèle dont vous avez besoin:

var view = from u in context.Users 
      select new UserViewModel 
       { 
        UserId = u.UserId, 
        Name = u.Name, 
        Age = u.Age 
       }; 

Faire de cette méthode comme réutilisable retour IQueryable<UserViewModel> et vous pouvez faire ce que vous voulez.

+0

Je faisais de la projection avant, mais pas avec une méthode réutilisable. Votre idée à la fois m'a aidé + mon code semble maintenant beaucoup plus élégant. Merci! –

+1

La base de données renvoie toujours des données inutiles, mais pas brillante. J'espérais supprimer certains varchar (max) s d'une requête en utilisant cette méthode, mais il retourne toujours toutes ces données et supprime simplement les propriétés dans l'application web – BritishDeveloper

+0

Ce qui est bien pour ce scénario, mais avertir les autres préoccupés par les performances – BritishDeveloper

Questions connexes