Search code examples
c#fluent-nhibernatenhibernate-mappingfluent-nhibernate-mapping

Fluent NHibernate Mapping Reference


I am fairly new to Fluent NHibernate. I was wondering if someone would please guide me into the right direction.

I have a class WorkDay, which represents every day of the week.

 Table("WorkDays");
 Id(x => x.ID).GeneratedBy.Identity();
 Map(x => x.Date);

I am adding a new table Holidays, which stores all the holidays for the entire year.

CREATE TABLE [dbo].[Holidays]( [ID] [smalldatetime] NOT NULL, [Description] varchar NULL)

I have created a class Holidays:

public class Holiday: Entity<DateTime>
    {
        public virtual string Description { get; set; }
    }

and mapped it:

public HolidayMap()
   {
      Table("Holidays");
      Id(x => x.ID).GeneratedBy.Assigned();
      Map(x => x.Description);
   }

What is the best way to properly Reference and map the Holidays in the WorkDay in order to check if the specific day is a Holiday?

Thank you for your suggestions.


Solution

  • Option 1: if you only need to know if a day is a holyday

    public virtual bool IsHolyDay { get; protected set; }
    
    // in WorkDayMap
    Map(x => x.IsHolyDay).Formula("(SELECT 1 FROM Holidays h WHERE h.Id = Date)");
    

    Option 2: if Holydays are static don't map it at all but keep all HolyDays in memory and use

    IDictionary<DateTime, HolyDay> holyDays;
    
    HolyDay holyDay;
    if (holyDays.TryGetValue(workDay.Date, out holyDay))
    {
        Print(workDay.Date + " is " + holyDay.Description);
    }
    else
    {
        Print(workDay.Date + " is no holyDay");
    }
    

    Option 3: you can if you really need to add an additional reference

    // in WorkDayMap
    Reference(x => x.HolyDay, "Date")
        .NotFound.Ignore()  // because not every date is a holyday
        .ReadOnly();        // you already have a property which is responsible for insertion
    

    but that would always have to load the HolyDay because NH has to know if the HolyDay exists to null the property or create a Proxy