unsavedvalue

2009/7/18 [email protected] <[email protected]>

>
> I'm new to NHibernate and I'm trying to get my head around the use of
> composite-id. I can get everything to work except SaveAndUpdate. I'm
> using verison 2.2.
>
> Table DDL is (unfortunately this can not change)
>
> CREATE TABLE  `argon`.`layer` (
>  `LAYERID` bigint(20) unsigned NOT NULL,
>  `CENTREID` bigint(20) unsigned NOT NULL,
>  `SERVERID` bigint(20) unsigned NOT NULL,
>  `DESCRIPTION` varchar(256) DEFAULT NULL,
>  KEY `Index_Layer` (`LAYERID`,`CENTREID`)
> )
>
>
> My mapping file so far is
>
> <?xml version="1.0" encoding="utf-8" ?>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>                   assembly="Argon.Admin"
>                   namespace="Argon.Admin">
>  <class name="Layer">
>
>    <composite-id>
>      <key-property name="LayerId"/>
>      <key-property name="CentreId"/>
>    </composite-id>
>
>    <property name="ServerId" />
>    <property name="Description" />
>
>  </class>
>
>  <query name="Layer.get_by_layer">from Layer where LayerId=:layer</
> query>
>
>  <query name="Layer.get_by_centre">from Layer where CentreId=:centre</
> query>
>
>  <query name="Layer.get_by_layer_and_centre">from Layer where
> (LAYERID=:layer) and (CENTREID=:centre)</query>
>
> </hibernate-mapping>
>
> And my code so far is
>
>    [Serializable]
>    public class Layer
>    {
>        public virtual long LayerId { get; set; }
>        public virtual long CentreId { get; set; }
>        public virtual long EMSServerId { get; set; }
>        public virtual string Description { get; set; }
>
>        public override Equals(Object aObject) {
>          ...code omitted for brevity
>        }
>
>        public override int GetHashCode()
>        {
>            return (int)((LayerId * 1000) + CentreId);
>        }
>
>
>        public static Layer Save(Layer aLayer)
>        {
>            // Just a convienience call - if record does not exist
> then null returned.
>            Layer existing_layer = GetByLayerIDAndCentreID
> (aLayer.LayerId, aLayer.CentreId);
>
>            using (ISession session = OpenSession())
>            {
>                if (existing_layer == null)
>                {
>                    session.Save(aLayer);
>                }
>                else
>                {
>                    session.Update(aLayer);
>                }
>
>                session.Flush();
>
>                return aLayer;
>            }
>
>        }
>
>        ... rest of code omitted for brevity
>    }
>
> Now this works but to me the Save method seems unweildy as I'm able
> just to use a SaveOrUpdate for all my other classes that have a simple
> primary key. If I try SaveOrUpdate then NH just does an update, fine
> for when an update is needed but fails for a new record.
>
> Reading the docs suggests that I can create a separate class to
> implement the key and refer to it in the composite-id element in the
> mapping. But when I do that the LayerID and CentreID fields of the
> Layer class do not get used, so for a method that gets data this end
> up blank.
>
> I was wondering if someone could give a clear example of the best (or
> a better) way of doing this assuming the database can not change.
>
> >
>


-- 
Fabio Maulo

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to