I have a legacy database that I am trying to create a mapping from that pulls from two tables (Table_A, Table_B) to create a Module with a list of Lockers. The key problem is creating a domain object from the Locker_Sizes and Locker_Top_Positions columns. I have attempted to map them with the IUserType below, but have no luck. Is it possible to do this mapping with Fluent NHibernate?
Module Mapping
public ModuleMap()
{
ReadOnly();
Table("Table_B");
Id(x => x.PartNumber).Column("ID_ITEM");
Map(x => x.WorkOrder).Column("ID_SO");
Map(x => x.SerialNumber).Column("Serial");
Join("Table_A", m =>
{
m.KeyColumn("ID_ITEM");
m.Map(x => x.LockerList)
.Columns.Add("Locker_Sizes","Locker_Top_Positions")
.CustomType<LockerString>();
m.Map(x => x.IsBeepEnabled).Column("Is_Kiosk");
});
}
Tables
CREATE TABLE `Table_A` (
`ID_ITEM` TEXT,
`Is_Kiosk` TEXT,
`Locker_Sizes` TEXT,
`Locker_Top_Positions` TEXT,
PRIMARY KEY(ID_ITEM)
);
CREATE TABLE `Table_B` (
`ID_ITEM` TEXT,
`ID_SO` TEXT,
`Serial` TEXT
);
Query
var modules = session.CreateCriteria(typeof(Module)).List<Module>();
LockerString Conversion
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
// get as string and return list of lockers
// names[0] Locker_Sizes "5,5,5"
// names[0] Locker_Top_Positions "1,6,11"
var lockerSizes = NHibernateUtil.String.NullSafeGet(rs, names[0]) as string;
var lockerTopPositions = NHibernateUtil.String.NullSafeGet(rs, names[1]) as string;
List<Locker> lockerList = new List<Locker>();
var sizesTok = lockerSizes.Split(',');
var topPositionsTok = lockerTopPositions.Split(',');
for (int i = 0; i < sizesTok.Length; i++)
{
var locker = new Locker(int.Parse(sizesTok[i]), int.Parse(topPositionsTok[i]));
lockerList.Add(locker);
}
return lockerList;
}
Domain Objects
public class Module
{
public virtual string WorkOrder { get; set; }
public virtual string PartNumber { get; set; }
public virtual string SerialNumber { get; set; }
public virtual string IsBeepEnabled { get; set; }
public virtual List<Locker> LockerList { get; set; }
}
public class Locker
{
public virtual int Height { get; set; }
public virtual int TopPosition { get; set; }
public Locker(int _height, int _topPosition)
{
this.Height = _height;
this.TopPosition = _topPosition;
}
}
Aucun commentaire:
Enregistrer un commentaire