2010-01-14 9 views
8

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.¿Existe un .NET Framework de Datos Polimórficos

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 separadamente 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 quiero 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.

Respuesta

2

Si el diseño de su "mesa de comentarios" que comentar de tipo agnóstica (sólo lo básico, como un ID, fecha & tiempo, y el contenido de texto), a continuación, puede use una sola tabla adicional que los mapee todos.

public interface ICommentable 
{ 
    int CommentTypeCode 
    int Id 
    ... 
} 

Ahora esa mesa asignador contiene columnas:

  • comment_type_code
  • target_object_id
  • comment_id

Sus comentarios todos van en una mesa, con un ID Tu varios " los 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 del asignador - simplemente asigne un nuevo código de tipo y cree la tabla con la columna Id requerida.

+0

Sí, este es exactamente el tipo de cosas en las que estaba pensando. Esperaba que hubiera una forma de manejar el tipo de conversión de forma transparente, pero parece que voy a tener que morder la bala y hacerlo. En este caso, tendría que comprobar el target_object_id, así como el comment_type, que probablemente solo sea el System.Type del objeto de destino. No he necesitado trabajar mucho con eso, así que parece que voy a aprender. – Josh

+0

Bueno, esto es asumiendo que su objetivo es reducir el número de tablas en su base de datos, que yo reuní de la pregunta original. En su lugar, me inclinaría a crear "tablas mapeo" para cada tipo de comentario, pero aun así mantener todos los comentarios en una tabla de comentarios. Si tiene una tabla "post_comments" con una columna post_id y una columna comment_id, puede consultarla cuando su vista o modelo necesite los comentarios para una identificación de correo postal en particular, no se requiere conversión de texto. – Jay

+0

sí, es correcto, para reducir el número de tablas y la cantidad de código que se debe escribir. En un mundo perfecto, funcionaría algo así como las mezclas de Ruby, pero eso no es realmente posible en C#. No es gran cosa, solo esperaba haberme perdido algo. – Josh

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 quieres lanzar cualquier grupo de FooComments a IComment, nosotros e el método de extensión Cast LINQ:

db.FooComments.Cast<IComment>() 
+0

Sí, este es el tipo de solución que estaba pensando.Esperaba que hubiera una manera de hacerlo que manejara el tipo de conversión de forma transparente, pero una función genérica es probablemente la mejor que obtendré. – Josh