Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a .NET Polymorphic Data Framework

I'm beginning work on a new project that's would be much easier if there was some way to make different data models polymorphic. I'm looking at using the Entity Framework 4.0 (when it's released), but have been unable to determine if it will actually be able to work.

Here's the basic scenario. I'm implemented a comment system, and would like to be able to connect it to many different types of models. Maybe I want comments on a person's profile, and comments on a webpage. The way I would do this in the past is to create relationships between the person table and the comment table separately from the relationship between the webpage table and the comment table. I think this leads to an overly complicated table structure in the database, however.

It would be best if I could just be able to add an interface to the objects I want comments on, and then simplify the table structure in the database to a single relationship.

The problem I'm running into is that I don't seem to know the right terminology in order to find information about how to do this type of thing. Any help anyone can provide would be greatly appreciated.

like image 714
Josh Avatar asked Jan 14 '10 16:01

Josh


2 Answers

If you design your "comments table" to be comment-type-agnostic (just the basics, like an id, date & time, and text content), you can then use a single additional table that maps them all.

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

Now that mapper table contains columns:

  • comment_type_code
  • target_object_id
  • comment_id

Your comments all go in one table, with an Id Your various "target objects" must all have an Id of the same type

Now you can arbitrarily add new "commentable" objects to your system without changing the comments table or the mapper table -- just assign it a new type code and create the table with the requisite Id column.

like image 186
Jay Avatar answered Nov 15 '22 12:11

Jay


I accomplish this with LinqToSql and partial classes. For each class that I want to implement an interface, I go to create a non-tool-generated file that contains part of the partial class that declares the class to implement the interface.

For example:

Generated code:

// this code is generated by a tool blah blah
partial class FooComment {
    // all the generated crap
    string Author {
        // ...
    }
    // etc
}

The interface:

interface IComment{
    string Author{ get; }
    // etc
}

My code:

// lovingly hand-written by me
partial class FooComment : IComment {
}

Now, if you want to cast any group of FooComments to IComment, use the Cast linq extension method:

db.FooComments.Cast<IComment>()
like image 31
recursive Avatar answered Nov 15 '22 12:11

recursive