Ichki qo'shilishda yaxshi nhibernat

Menda 3 ta jadval mavjud (Master, Imagen, Linea):

Master
public virtual int Id { get; private set; }
public virtual Imagen imagen { get; set; }

Imagen
public virtual int Id { get; private set; }
public virtual Linea linea { get; set; }

Linea
public virtual int Id { get; private set; }
public virtual String Nombre { get; set; }

Menga shunday so'rov kerak:

SELECT * FROM dbo.Master 
INNER JOIN dbo.Imagen ON dbo.Master.imagen_id = dbo.Imagen.Id 
INNER JOIN dbo.Linea ON dbo.Imagen.linea_id = dbo.Linea.Id 
WHERE dbo.Linea_Id = 5

Lekin, bu so'rovni automapper yordamida yaratishda Erkin Nibernateni qanday qilishni bilmayman. Hozirgacha buni sinab ko'rdim:

ICriteria c = session.CreateCriteria(typeof(Master))
  .CreateAlias("dbo.Imagen", "img", JoinType.InnerJoin)
  .Add(Restrictions.Eq("img.linea_id", id_linea));

return c.List();

Lekin men bu xatoni qabul qilaman: xususiyatini hal qila olmadi: dbo: ImageManager.Model.Entity.Master

Ichki Ishtirok etishni qanday qilish haqida har qanday fikr? Oldindan rahmat

3

2 javoblar

Bir boshlang'ich uchun dbo.Imagen'dan dbo'dan qutulaman. ICriteria interfeysidan foydalanib, ob'ektni jadvalga va xususiyatlarga ustunlarga bir-biriga o'xshash bo'lishi mumkin bo'lsa-da, ma'lumotlar bazasi jadvallarini emas, balki ob'ektlarning in-terms deb o'ylashingiz kerak.

EDIT:
another option would be to use the QueryOver Lambda syntax.

   var list = session.QueryOver()
                        .JoinQueryOver(master => master.imagen)
                        .Where(imagen => imagen.linea.Id == 5)
                        .List();
8
qo'shib qo'ydi
Buning uchun uzr so'rayman ... QueryOver sintaksisini o'zim ham o'rganyapman. Tuzatiladi.
qo'shib qo'ydi muallif Nathan Fisher, manba
qattiq. Buni sinab ko'rdim. U hozir ishlashi kerak.
qo'shib qo'ydi muallif Nathan Fisher, manba
Rahmat, Alredy buni qildi. Men juda yaxshi bilaman Nhibernate.
qo'shib qo'ydi muallif lloiacono, manba
Men buni sinab ko'rdim, lekin bu xatoni olib tashladim: "xususiyatni hal qila olmadim: imagen.linea.Id: ImageManager.Model.Entity.Master" Men ham o'zgartirdim. (Master => Master.imagen.linea.Id == 5 ), lekin men bir xil xatoga yo'l qo'yaman
qo'shib qo'ydi muallif lloiacono, manba
u ishlaydi !!!, juda ko'p rahmat. Yaxshiyamki, ICriteria-ni ishlatish bilan yakun topdim, chunki men bu usta bilan bog'liq rasm va chiziqlar olishim kerak edi, shuning uchun imagen va hdd uchun creationalias qo'shganman, agar men buni qilmasam, rasm yoki hdd xususiyatlariga kirishga harakat qilganda LazyLoadException qilsam mening ustam ob'ekt.
qo'shib qo'ydi muallif lloiacono, manba
bu erda kod: ICriteria c = session.CreateCriteria (typeof (MasterHdd)) .CreateAlias ​​("imagen", "img", JoinType.InnerJoin) .CreateAlias ​​("hdd", "h", JoinType.InnerJoin) .CreateAlias "img.linea", "lin", JoinType.InnerJoin) .Add (cheklovlar.Eq ("lin.Id", id_linea)); qaytish c.List ();
qo'shib qo'ydi muallif lloiacono, manba

Agar siz allaqachon uni tuzatgan bo'lsangiz, avvalgi sharhlaringizdan foydalanib olmayman, lekin harakat qilaman

ICriteria c = session.CreateCriteria(typeof(Master))

.CreateAlias("imagen", "img", JoinType.InnerJoin)
.CreateAlias("img.linea", "lin", JoinType.InnerJoin)
.Add(Restrictions.Eq("lin.Id", 5));

return c.List();

EKRANI: Qopqoqni quyida ko'rsatilganidek o'zgartirildi.

3
qo'shib qo'ydi
Qaysi xato xabari olasiz?
qo'shib qo'ydi muallif fluent, manba
Yaxshi joy. Mening javobimdagi qopqoq o'zgardi.
qo'shib qo'ydi muallif fluent, manba
Menimcha, bu savolga javob beradigan yagona masala - bu ob'ektlar murojaatlarining holatidir. @lloiacono'nun ob'ekt mos yozuvlar bo'lsa, barcha kük harflar imajı bo'lgan Imagen mavjud. Linea havolasi bir xil bo'ladi. Buning sababi ishlamayotganligining sababi bo'lishi mumkin.
qo'shib qo'ydi muallif Nathan Fisher, manba
Bir necha yil oldin, Stephen Bohlen tomonidan nhibernate seriyasining bir qismini ko'rib chiqing, ammo uning asoslari ICriteria uchun bor va umuman olganda nhibernate. shuningdek, funnelweblog.com ga qarang. Bu ochiq-oydin blog platformasi, ochiq-oydin gapga asoslangan
qo'shib qo'ydi muallif Nathan Fisher, manba
Juda katta rahmat, hozir men bu ish ustida ishlayapman. Muammo shundaki, u ishlamayapti. Bu men olgan xato: "xususiyatni hal qila olmadim: Imagen of: ImageManager.Model.Entity.Master" .Model papkasida xaritalash uchun Automappingdan foydalanib: Imkoniyatlarni (m => m.AutoMappings.Add (model))) Model papkasida "Entity" deb nomlangan pastki jild bor va u erda mavjud narsalar mavjud:
qo'shib qo'ydi muallif lloiacono, manba
ommaviy sinfi Master {public virtual int Id {get; maxsus to'plam; } umumiy virtual Imagen imagen {get; to'siq; } ommaviy virtual Hdd hdd {get; to'siq; } ommaviy virtual string hash_master {get; to'siq; }}
qo'shib qo'ydi muallif lloiacono, manba
public class Linea {ommaviy virtual int Id {get; maxsus to'plam; } umumiy virtual int ObjVersion {get; to'siq; } umumiy virtual string Nombre {get; to'siq; } umumiy virtual String Tabla {get; to'siq; } ommaviy virtual String NombreCorto {get; to'siq; }} ommaviy sinfi Imagen {public virtual int Id {get; maxsus to'plam; } umumiy virtual String PartNumber {get; to'siq; } umumiy virtual string versiyasi {get; to'siq; } Public virtual string So {get; to'siq; } umumiy virtual string versiyasi {get; to'siq; } umumiy virtual Linea linea {get; to'siq; } umumiy virtual string Nombre {get; to'siq; }}
qo'shib qo'ydi muallif lloiacono, manba
Rahmat @NathanFisher, albatta, bu muammo edi. Men xato qilolmaysiz, men uchun yaxshi qo'llanma qo'llashni maslahat bera olasizmi, vikini o'qiyapman, lekin Icriteria haqida hech qanday ma'lumot topa olmayapman.
qo'shib qo'ydi muallif lloiacono, manba