0

I've just started to play around with Fluent NHibernate and would like some help / pointers on how I got about mapping this. Here's the domain model I'm working with:

Class User: Your standard user class

Class Preference: A set of key value pairs. A user can have many preferences.

Class Post: Omitted complete description for the sake of brevity, but a user creates a post and it can contain one or more preferences.

So, to recap:

class User 
{
    IList<Preference> Preferences;
    IList<Post> Posts;
} 

class Post
{
    IList<Preference> PostData;
}

Hibernate automapper comes up with the following DB Structure:

User
------------------------
User_Id

Preference
------------------------
Preference_Id | User_Id | Post_Id

Post
------------------------
Post_Id | User_Id

The preference table looks ugly to me and would much rather have something like:

User
------------------------
User_Id

Preference
------------------------
Preference_Id | User_Id

Post
------------------------
Post_Id | User_Id | Preference_Id

Any help on how to do this is much appreciated! I already have a class that implements the IAutoMappingOverride interface, but I'm not sure how to do the actual mapping.

Thanks,
Teja

Tejaswi Yerukalapudi
  • 8,987
  • 12
  • 60
  • 101
  • what is Preference_Id in Post table good for? You said a post has many Preferences. Also does `Post.Preferences` contain the same elements as `User.Preferences`? – Firo Apr 16 '13 at 13:57
  • Yes .. The Post.Preferences always contains data from User.Preferences. – Tejaswi Yerukalapudi Apr 16 '13 at 17:40

2 Answers2

1

I would reference this configuration to get you manual and auto mappings configured correctly:
Mixing Mixing Automapping and manual mapping

I also noticed you have some composite keys in both your preference and post tables I would look into learning how to map composite keys. Here is a link that might help you with mapping composite keys(primary key with more than one column):
Using Fluent NHibernate to map Composite Keys

As far as your fluent maps go the following might get you pointed in the right direction you can map one-to-many relationships using both HasMany or References depending on which table you want the foreign key on:

public class UserMap : ClassMap<User>
{
    public UserMap(){
        Id(x => x.Id).Column("User_Id").GeneratedBy.Identity();
        HasMany(x => x.Preferences);
    }
}
public class PostMap: ClassMap<Post>
{
    public UserMap(){
        Id(x => x.Id).Column("Post_Id").GeneratedBy.Identity();
        References(x => x.Preferences); 
    }
}
Community
  • 1
  • 1
jaredmahan
  • 86
  • 6
0

since the preferences are the same a simple property is enough

class Post
{
    public virtual User User { get; set; }
    public virtual IList<Preference> Preferences { get { return User.Preferences; } }
}
Firo
  • 30,626
  • 4
  • 55
  • 94