Alex
Alex

Reputation: 55

Entity Framework 4.1 - Segregating an entity into multiple tables (Code-First)

I'm trying to find out how I can re-use a simple 'Comment' entity type for multiple scenarios where something is 'commentable' in my application.

At the moment, I have a couple of entities that a user is able to post comments to. Examples include Blogs, Profiles and Photos - these can all be 'commented' on.

I'd like to be able to use the same 'Comment' class for each of these scenarios, but I don't want to end up with one HUGE table full of comments for everything. I figure it would be much more efficient to at least store a table of BlogComments, PhotoComments, and ProfileComments. At the moment, my Comment class looks like this:

public class Comment
{
   [Key]
   public int Id { get; set; }

   public int ContextId { get; set; }

   [StringLength(256)]
   public string Content { get; set; }

   public DateTime DatePosted { get; set; }

   public virtual Member Author { get; set; }
}

Presumably, I'd need the 'ContextId' field to refer to the particular thing being commented on. This Id might be the Id of a Blog, a Profile or a Photo. I was hoping to be able to refer to comments much like a normal ICollection in these classes, and I have some code like this for the Photos as an example:

public class Photo
{
    [Key]
    public int Id { get; set; }

    [StringLength(48)]
    public string FileName { get; set; }

    public virtual Member Owner { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
}

I've been pointed to various articles during my searches, but none really seem relevant to my particular situation. How can I map these comment collections to different tables, and avoid having a comment "super-table"?

Any help, pointers or advice would be hugely appreciated :)

Upvotes: 1

Views: 175

Answers (1)

Eranga
Eranga

Reputation: 32437

You can create an abstract Comment class and inherit from it specific comments such as PhotoComment, ProfileComment. You will be able to map the comments to different tables.

public abstract class Comment
{
   [Key]
   public int Id { get; set; }

   [StringLength(256)]
   public string Content { get; set; }

   public DateTime DatePosted { get; set; }

   public virtual Member Author { get; set; }
}


public class PhotoComment : Comment
{
   public int PhotoId { get; set; }

   public virtual Photo Photo { get; set; }
}


public class Photo
{
    [Key]
    public int Id { get; set; }

    [StringLength(48)]
    public string FileName { get; set; }

    public virtual Member Owner { get; set; }

    public virtual ICollection<PhotoComment> Comments { get; set; }
}

Upvotes: 1

Related Questions