2009-08-06 11 views
13

Digamos que tengo 2 clases en el modelo: Usuario (asignado a la tabla USERS) y PrivilegedUser (hereda User, la información adicional se almacena en la tabla PRIVILEGEDUSERS).Entidad Framework: herencia, cambie el tipo de objeto

Ahora, tengo una fila en USUARIOS (y instancia de Usuario) y necesito convertir ese usuario a Usuario Privilegiado (es decir, crear un registro en PRIVILEGEDUSERS con el mismo Id). ¿Hay alguna manera de hacerlo sin Eliminar/Insertar?

El problema es que no tiene la representación PRIVILEGEDUSERS en el modelo, por lo que no puede crear solo esa parte de PrivilegedUser.


Fue solo un ejemplo. PrivilegedUser puede tener algún descuento o administrador personal o lo que sea además de a las propiedades de usuario normales. Al mismo tiempo, hay otras tablas que necesitan referenciar a los usuarios independientemente del tipo de Usuario concreto. Lo he implementado usando el modo de herencia Tabla por tipo. En el nivel de la base de datos, es muy simple convertir usuarios de un tipo a otro (solo necesita insertar o eliminar registros de la tabla de extensiones). Pero en EF solo tiene UserSet que almacena objetos User y PrivilegedUser. Es por eso que pregunto si es posible reemplazar existente Objeto de usuario con PrivilegedUser que mantiene Id existente y sin eliminar registro de la tabla USERS.

Respuesta

0

Parece incorrecto que tenga dos tablas que representan a los usuarios.

¿No sería mejor tener una tabla de Usuarios (para todos los usuarios) y luego una tabla de UserPrivileges, que represente lo que están autorizados a hacer? De esta forma, no se necesitan supresiones/inserciones, y puede hacer referencia solo a una tabla para los usuarios.

Se puede utilizar una tercera tabla para representar los privilegios reales.

Usuarios
Id nombre de usuario ...

UserPrivileges
UserId PrivilegeId

privilegios
ID Descripción

+1

Esto es correcto. Una instancia debe/nunca puede cambiar el tipo. Entonces, ¿qué sucede cuando un usuario se convierte en privilegiado o no? –

+0

@Craig, alguna noticia? Me encontré con la misma pregunta. – Shimmy

+0

@Shimmy, "¿noticias?" ¿Qué noticias? Si crees que tu objeto necesita cambiar el tipo, entonces probablemente estés haciendo un mal uso de la herencia. @ La respuesta de DanDan sigue siendo una mejor idea. –

3

No, no puede.

Según lo explicado en this article, EF (3.5) no es compatible con esta característica. Debe usar el procedimiento almacenado para lograr esto.

1

necesita cambiar su visión del mundo. Su punto de vista es que tiene usuarios estándar con privilegios estándar y superusuarios con privilegios adicionales. Los privilegios no están enumerados, están implícitos.

La nueva vista del mundo es que usted mantiene una lista de todos los privilegios, tanto estándar como super y luego en una tabla de asignación crea un mapa de muchos a muchos de los cuales los usuarios tienen privilegios. Cuando a un usuario se le otorgan privilegios especiales, solo agrega asignaciones para los privilegios apropiados a la tabla de asignación. No necesita una clase PrivilegedUser, solo una lista de privilegios en la clase User. Los privilegios pueden ser estándar o super.

0

Como dije, no puede. Ya sea por procedimientos almacenados o por una inserción personalizada/consulta de actualización. Tuve un problema similar, ahora estoy usando la solución que describí en esta respuesta: https://stackoverflow.com/a/28380804/2424989

Cuestiones relacionadas