He encontrado algo de información sobre esto, pero no lo suficiente como para entender cuál es la mejor práctica para este escenario. Tengo su configuración típica de TPH con una clase base abstracta "Firme". Tengo varios hijos, "Pequeña empresa", "Gran empresa", etc. que heredan de la empresa. En realidad, en realidad tengo diferentes clasificaciones realistas para las empresas, pero estoy tratando de mantenerlo simple en este ejemplo. En la base de datos según TPH tengo una única tabla Firm con una columna FirmTypeId (int) que diferencia entre todos estos tipos. Todo funciona muy bien, excepto que tengo un requisito para permitir que un usuario cambie un tipo de empresa en otra. Por ejemplo, un usuario podría haber cometido un error al agregar la empresa y le gustaría cambiarlo de Gran empresa a Pequeña empresa. Debido a que el marco de la entidad no permite exponer la columna discriminatoria de la base de datos como una propiedad, no creo que haya una forma de cambiar un tipo a otro a través de EF. Por favor, corríjame si estoy equivocado. Como yo lo veo, tengo dos opciones:Entity Framework 4 TPH inheritance, ¿cómo cambiar un tipo a otro?
- No utilice TPH. Simplemente tenga una entidad firme y vuelva a usar .Where (FirmTypeId == something) para diferenciar entre los tipos.
- Ejecute SQL directamente utilizando context.ExecuteStoreCommand para actualizar la columna FirmTypeId de la base de datos.
He visto una publicación donde la gente sugiere que Uno de los principios de OOP es que las instancias no pueden cambiar su tipo. Aunque tiene mucho sentido para mí, parece que no puedo conectar los puntos. Si tuviéramos que seguir esta regla, entonces el único momento para usar cualquier tipo de herencia (TPH/TPT) es cuando uno está seguro de que un tipo nunca se convertiría en otro. Entonces, una pequeña empresa nunca se convertirá en una gran empresa. Veo sugerencias de que la composición debería usarse en su lugar. A pesar de que no tiene sentido para mí (lo que significa que no veo cómo una empresa tiene una gran empresa, para mí una gran empresa es una empresa), puedo ver cómo se puede modelar la composición en EF si los datos están en múltiples tablas Sin embargo, en una situación en la que tengo una sola tabla en la base de datos, parece que es TPH o lo que he descrito en los números 1 y 2 anteriores.
Ese "alguien" puede haber sido yo. En OO basado en clases, los objetos no pueden cambiar tipos. Nunca. C# no permite esto. El EF ciertamente no agrega tal característica a C#. Lo único que es diferente en el EF es que la vida del objeto es más larga, efectivamente, para siempre. –
Craig, podría haber sido usted. Acabo de editar la publicación para incluir un poco más de información sobre esto también. Si no te importa revisar el último párrafo en mi publicación y arrojar algo de luz sobre el enfoque correcto. – e36M3
¿Cuál es la diferencia entre una "pequeña empresa" y una "gran empresa", exactamente? Por cierto, no recibo notificaciones de tus respuestas a menos que pongas @Craig en ellas. –