0

Using NHibernate is it possible to map columns in a table to a collection of objects.

For example if I have a very badly designed database table with columns as such: ClientID ClientName First_AmountPaid Second_AmountPaid Third_AmountPaid Fourth_AmountPaid

Is it possible to map this to the following class structure where First_AmountPaid through to Fourth_AmountPaid have their own class implementation?

public class Client
{
    public int ClientId { get; set; }
    public string ClientName { get; set; }

    public IList<AmountPaid> Amounts { get; set; }
}

public class AmountPaid
{
    public decimal Amount { get; set; }
}

public class FirstAmountPaid : AmountPaid{ }
public class SecondAmountPaid : AmountPaid{ }
public class ThirdAmountPaid : AmountPaid{ }
public class FourthAmountPaid : AmountPaid{ }

Therefore giving a more meaningful code structure.

Thank you

Andy C
  • 53
  • 1
  • 4

1 Answers1

0

i'm not sure why there are subclasses when the listposition already defines the order of the amounts

Map(x => x.Amounts)
    .Columns.Add("First_AmountPaid", "Second_AmountPaid", "Third_AmountPaid", "Fourth_AmountPaid")
    .CustomType<AmountPaidType>();

class AmountPaid : IUserType
{
    public object Assemble(object cached, object owner)
    {
        return cached;
    }

    public object DeepCopy(object value)
    {
        return ((IList<AmountPaid>)x).Select(a => a.Clone()).ToList();
    }

    public object Disassemble(object value)
    {
        return value;
    }

    bool IUserType.Equals(object x, object y)
    {
        // assuming AmountPaid implements Equals
        return ((IList<AmountPaid>)x).SequenceEquals((IList<AmountPaid>)y);
    }

    public int GetHashCode(object x)
    {
        return x.GetHashCode();
    }

    public bool IsMutable
    {
        get { return true; }
    }

    public void NullSafeSet(cmd, value, index)
    {
        var list = (IList<AmountPaid>)value;
        NHibernateUtil.Double.NullSafeSet(cmd, list[0].Amount, index);
        NHibernateUtil.Double.NullSafeSet(cmd, list[1].Amount, index + 1);
        NHibernateUtil.Double.NullSafeSet(cmd, list[2].Amount, index + 2);
        NHibernateUtil.Double.NullSafeSet(cmd, list[3].Amount, index + 3);
    }

    public object NullSafeGet(rs, names, owner)
    {
        var list = new List<AmountPaid>();
        foreach (var name in names)
        {
            list.Add(new AmountPaid((double)NHibernateUtil.Double.Get(rs, name)));
        }
        return list;
    }

    public object Replace(object original, object target, object owner)
    {
        return original;
    }

    public Type ReturnedType
    {
        get { return typeof(IList<AmountPaid>); }
    }

    public SqlType[] SqlTypes
    {
        get { return new[] { SqlTypeFactory.Double, SqlTypeFactory.Double, SqlTypeFactory.Double, SqlTypeFactory.Double }; }
    }
}
Firo
  • 30,626
  • 4
  • 55
  • 94