views:

555

answers:

1

I have an Events table whose goal is to store actions done by web site users. An action basically alters or create a new row in a table X. This will allow me to store an history of all actions done by a user. As such, Events contains:

  • a primary key column
  • a text to describe the event (ex: "posted a comment")
  • a discrimator column if needed
  • a foreign key column to another table A
  • a foreign key column to another table B
  • ....
  • a foreign key column to another table N

A row in the Events table will have only one of the foreign key columns set, all others will be null (so they are all nullable). The table behaves like an indirection table to the actual table concerned by the event. I don't know if a discriminator is needed since all the information is contained in the foreign key columns. Tables A to N can be anything. Their domain model class can have a common interface if necessary (IEventRecordable).

My question is: Is a mapping possible between the Events table and an Event class? Is it especially feasible with fluent nhibernate? Can it be done without having to create many derived classes of Event (I don't want to create so many empty subclasses)? The Event class would ideally be as follows:

public class Event
{
    public virtual int Id { get; set; }
    public virtual IEventRecordable ActualEvent { get; set; }
    public virtual string EventDescription { get; set; }
    DateTime EventDateTime { get; set; }
}

Many classes among the domain model classes could implement IEventRecordable (which is mainly an empty interface). It could be the User table or a BlogComment table...

Thanks

+2  A: 

If you forget about the multiple foreign key columns, you can make this an <any> mapping.

Thom
Didn't try it yet because I'm using Fluent NHibernate and I'll have to check how to mix both techniques (xml + FNH), but:1. It seems this is a solution. Thx.2. This is not implemented in FNH yet.
Nicolas Cadilhac
Then it should really be called 'Conversational NHibernate'. :)
Thom