2

I am using Nhibernate 3.2, along with a build of FluentNhibernate compatible with NH 3.2 and I have come to map a legacy part of my system. I believe it is possible to do what I require, but need some assistance in mapping it correctly.

I have a User Class below, with a list of Applications.

public class User 
{
    public virtual string UserID { get; set; }
    public virtual int Id { get; set; }
    public virtual IList<Application> Applications { get; set; }
}

I also have a Application class which has a foreign key back to the User Class which is not the "primary key". See Below

public class Application 
{
    // Not sure if this 'User' is needed?
    public virtual User User { get; set; }
    public virtual int IdFromUserTable { get; set; }
    public virtual string ApplicationName { get; set; }

}

I have the corresponding ClassMaps, I think the UserMap is where the issue lies

UserMap

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserID);
        HasMany(x => x.Applications)
            .AsBag()
            .KeyColumn("UserID")
            .PropertyRef("Id")
            .LazyLoad()
            .Inverse();
        Table("usertable");
        ReadOnly();
    }
}

ApplicationMap

public class ApplicationMap : ClassMap<Application>
{
    public ApplicationMap()
    {
        CompositeId()
            .KeyProperty(x => x.ApplicationName)
            .KeyProperty(x => x.IdFromUserTable, "UserID");   
        Table("applicationstable");
    }
}

The Table structures are as follows:

User Table

Primary Key - string, ColumnName = UserID
int (Identity) - int, ColumnName = Id

Applications Table

Composite Key - string, ColumnName = ApplicationName
and
int, ColumnName = UserId (references Id column in user table)

My question is how to get the mapping to work for the above scenario.

One caveat is: I cannot change the structure of the database, but I can change the classes / classmaps

Any help greatly appreciated..

PS - I did get this to work by adding in Fetch.Join in the HasMany userMap, but I would prefer to lazily evaluate the Application List when needed

Thanks, Mark

Mark H
  • 707
  • 1
  • 11
  • 21
  • What was the Fetch.Join solution? I have this same issue. I suspect the 99% of programmers who work with real systems have this issue, but reject ORM's outright, as all of the documentation assumes you completely own the database schema, which is very very rare. – Daniel Williams Aug 29 '12 at 03:48

0 Answers0