c# - interfaces - ¿Existe un Marco de Datos Polimórficos.NET
polymorphism c# (2)
Lo logro con LinqToSql y clases parciales. Para cada clase que deseo implementar una interfaz, voy a crear un archivo no generado por herramientas que contiene parte de la clase parcial que declara a la clase para implementar la interfaz.
Por ejemplo:
Código generado:
// this code is generated by a tool blah blah
partial class FooComment {
// all the generated crap
string Author {
// ...
}
// etc
}
La interfaz:
interface IComment{
string Author{ get; }
// etc
}
Mi código:
// lovingly hand-written by me
partial class FooComment : IComment {
}
Ahora, si desea lanzar cualquier grupo de FooComments a IComment, use el método de extensión de Cast
linq:
db.FooComments.Cast<IComment>()
Estoy empezando a trabajar en un nuevo proyecto que sería mucho más fácil si hubiera alguna manera de hacer que los diferentes modelos de datos sean polimórficos. Estoy buscando utilizar Entity Framework 4.0 (cuando se lanzó), pero no he podido determinar si realmente podrá funcionar.
Aquí está el escenario básico. Implementé un sistema de comentarios y me gustaría poder conectarlo a muchos tipos diferentes de modelos. Tal vez quiera comentarios en el perfil de una persona y comentarios en una página web. La forma en que haría esto en el pasado es crear relaciones entre la tabla de persona y la tabla de comentarios por separado de la relación entre la tabla de página web y la tabla de comentarios. Sin embargo, creo que esto lleva a una estructura de tabla demasiado complicada en la base de datos.
Sería mejor si pudiera agregar una interfaz a los objetos sobre los que deseo comentarios, y luego simplificar la estructura de la tabla en la base de datos a una sola relación.
El problema al que me estoy enfrentando es que no parezco conocer la terminología correcta para encontrar información sobre cómo hacer este tipo de cosas. Cualquier ayuda que alguien pueda brindar sería muy apreciada.
Si diseña su "tabla de comentarios" para que sea agnóstica de tipo comentario (solo lo básico, como un id, fecha y hora, y contenido de texto), puede usar una sola tabla adicional que los mapee todos.
public interface ICommentable
{
int CommentTypeCode
int Id
...
}
Ahora esa tabla mapeador contiene columnas:
- comment_type_code
- target_object_id
- comment_id
Todos sus comentarios van en una sola tabla, con un Id Sus diversos "objetos de destino" deben tener todos Id. Del mismo tipo
Ahora puede agregar arbitrariamente nuevos objetos "comentables" a su sistema sin cambiar la tabla de comentarios o la tabla de asignadores; simplemente asigne un nuevo código de tipo y cree la tabla con la columna Id requerida.