2009-08-06 6 views
13

Disons que j'ai 2 classes dans le modèle: Utilisateur (mappé à la table USERS) et PrivilegedUser (hérite de l'utilisateur, les informations supplémentaires sont stockées dans la table PRIVILEGEDUSERS).Entity Framework: Héritage, change le type d'objet

Maintenant, j'ai une ligne dans USERS (et une instance de User) et je dois convertir cet utilisateur en PrivilegedUser (c'est-à-dire pour créer un enregistrement dans PRIVILEGEDUSERS avec le même ID). Existe-t-il un moyen de le faire sans supprimer/insérer? Le problème est que vous n'avez pas de représentation PRIVILEGEDUSERS dans le modèle, vous ne pouvez donc pas créer uniquement cette partie de PrivilegedUser.


C'était juste un exemple. PrivilegedUser peut avoir un rabais ou un gestionnaire personnel ou autre en plus aux propriétés utilisateur ordinaires. Dans le même temps, il existe d'autres tables qui doivent référencer les utilisateurs quel que soit le type d'utilisateur concret. Je l'ai implémenté en utilisant le mode d'héritage Table-per-Type. Au niveau de la base de données, il est très simple de convertir les utilisateurs d'un type à un autre (il suffit d'insérer ou de supprimer un enregistrement de la table d'extension). Mais dans EF vous avez seulement UserSet qui stocke les objets User et PrivilegedUser. C'est pourquoi je demande est-il possible de remplacer objet utilisateur existant avec PrivilegedUser en conservant Id existant et sans supprimer l'enregistrement de la table USERS.

Répondre

0

Il semble erroné que vous ayez deux tables représentant des utilisateurs.

Ne vaudrait-il pas mieux avoir une table Users (pour tous les utilisateurs) et ensuite une table UserPrivileges, représentant ce qu'ils sont autorisés à faire? De cette façon, aucune suppression/insertion n'est nécessaire et vous ne pouvez référencer qu'une seule table pour les utilisateurs.

Une troisième table peut être utilisée pour représenter les privilèges réels.

utilisateurs
Id ... Nom d'utilisateur

UserPrivileges
UserId PrivilegeId

Privilèges
ID Description

+1

Ceci est correct. Une instance devrait/ne peut jamais changer de type. Alors que se passe-t-il lorsqu'un utilisateur devient privilégié ou non privilégié? –

+0

@Craig, des nouvelles? J'ai rencontré la même question. – Shimmy

+0

@Shimmy, "nouvelles?" Quoi de neuf? Si vous pensez que votre objet doit changer de type, alors vous utilisez probablement l'héritage. @ La réponse de DanDan est encore une meilleure idée. –

3

Non, vous ne pouvez pas.

Comme expliqué par this article, EF (3.5) ne supporte pas cette fonctionnalité. Vous devez utiliser la procédure stockée pour accomplir ceci.

1

Vous devez changer votre vision du monde. Votre avis est que vous avez des utilisateurs standard avec des privilèges standard et des super-utilisateurs avec des privilèges supplémentaires. Les privilèges ne sont pas énumérés, ils sont implicites. La nouvelle vue du monde est que vous maintenez une liste de tous les privilèges, à la fois standard et super, puis dans une table de mappage vous créez une carte plusieurs à plusieurs dont les utilisateurs ont les privilèges. Lorsqu'un super privilège est accordé à un utilisateur, il suffit d'ajouter des mappages pour les privilèges appropriés à la table de mappage. Vous n'avez pas besoin d'une classe PrivilegedUser, juste une liste de privilèges dans la classe User. Les privilèges peuvent être standard ou super.

0

Comme dit, vous ne pouvez pas. Soit par des procédures stockées ou par une requête d'insertion/mise à jour personnalisée. J'ai eu le même problème, maintenant j'utilise la solution que j'ai décrite dans cette réponse: https://stackoverflow.com/a/28380804/2424989