loading - Problem with NHibernate mapping when Id is in abstract base class -
i'm quite new nhibernate, doing right until face problem, looks nhibernate bug, being newbie it, can fault
having base class id , equality stuff
public abstract class objetoconid { public objetoconid() { id=newid(); } public virtual guid id {get;private set;} public override bool equals(object o) { if (object.referenceequals(this,o)) return true; if (o==null) return false; objetoconid oid; oid= o objetoconid; if (!object.referenceequals(oid,null)) return (id.equals(oid.id)); return (base.equals(o)); } public override int gethashcode() { byte[] bid; bid=id.tobytearray(); return ((int32)(bid[8]^bid[12])<<24) + ((int32)(bid[9]^bid[13])<<16) + ((int32)(bid[10]^bid[14])<<8) + ((int32)(bid[11]^bid[15])); } public virtual bool equals(objetoconid o) { if (object.referenceequals(this,o)) return true; if (object.referenceequals(o,null)) return false; return (id.equals(o.id)); } public virtual string tostring() { return this.gettype().fullname + "[id=" + id + "]"; } protected virtual guid newid() { return guidcomb.newguid(); } public static bool operator == (objetoconid x,objetoconid y) { if(object.referenceequals(x,y)) return true; if(object.referenceequals(x,null)) return false; return x.equals(y); } public static bool operator != (objetoconid x,objetoconid y) { return !(x==y); } /// <summary> /// metodo interno para permitir el testing /// </summary> /// <param name="id"></param> internal void setid(guid id) { id=id; } } and entity
public class propiedad : objetoconid,ipropiedad { [obsolete("persistance constructor only")] public propiedad () { } public propiedad (ilist<idescripcioncalificada> descripciones) { descripciones=new dictionary<string,idescripcioncalificada>(descripciones.count); foreach(idescripcioncalificada d in descripciones) descripciones.add(d.nombre,d); } #region ipropiedad implementation public virtual idictionary<string, idescripcioncalificada> descripciones {get;private set;} #endregion } and mapping
public class mapeopropiedad : classmap<propiedad> { public mapeopropiedad() { id(x => x.id).column("pro_id").generatedby.assigned(); hasmany<descripcioncalificada>(x => x.descripciones) .cascade.saveupdate() .asmap<string>(index => index.nombre) ; } } the test is
[testfixture] public class testpropiedadpersistencia { [testfixturesetup] public void testfixturesetup() { string connectionstring="server=127.0.0.1;database=ana;user id=dev-test;password=dev-test;"; fcfg=fluently.configure() .database(postgresqlconfiguration.postgresql82.connectionstring(connectionstring)) .mappings(m => m.fluentmappings.addfromassemblyof<mapeopropiedad>()); fcfg.exposeconfiguration(cfg => new schemaexport(cfg).create(false, true)); sessions=fcfg.buildsessionfactory(); } isessionfactory sessions; fluentconfiguration fcfg; [testfixtureteardown] public void testfixtureteardown() { fcfg.exposeconfiguration(cfg => new schemaexport(cfg).drop(false, true)); sessions.close(); sessions = null; fcfg = null; } [test] public void cancorrectlymappropiedad() { descripcioncalificada descri1=new descripcioncalificada("descri",new descripcion("esta es la descri")); descripcioncalificada descri2=new descripcioncalificada("descrilarga",new descripcion("esta es la descrilarga")); dictionary<string,idescripcioncalificada> descris=new dictionary<string, idescripcioncalificada>(2); descris.add(descri1.nombre,descri1); descris.add(descri2.nombre,descri2); new persistencespecification<propiedad>(sessions.opensession(),new customequalitycomparer() ) .checkproperty(c => c.descripciones,descris) .verifythemappings(); } } the thing test fails unless put not.lazyload() in mapping gives mapping error
ana.nucleo.lenguaje.test.testdescripcioncalificadapersistencia (testfixturesetup): fluentnhibernate.cfg.fluentconfigurationexception : invalid or incomplete configuration used while creating sessionfactory. check potentialreasons collection, , innerexception more detail. ----> nhibernate.invalidproxytypeexception : following types may not used proxies: ana.catalogacion.implementacion.propiedad: method setid should 'public/protected virtual' or 'protected internal virtual' without lazy loading pass, , if put id property in propiedad class , not inherit objetoconid pass, , without not.lazyload().
anyone can confirm nh bug, or appreciated
edit:
i've found problem, fault. missed setid internal function not being virtual protected , confused setter of id property, , missunderstood execption
fer
i've found problem, fault. missed setid internal function not being virtual protected , confused setter of id property, , missunderstood execption
Comments
Post a Comment